Directx HLSL着色器中的不确定性瑕疵
我有一个HLSL着色器(使用fxc和ps_2_b编译),它给了我闪烁的伪影。首先,我需要确定所有变量似乎都是常量,并且使用以下着色器确定它们的值:Directx HLSL着色器中的不确定性瑕疵,directx,hlsl,directx-9,Directx,Hlsl,Directx 9,我有一个HLSL着色器(使用fxc和ps_2_b编译),它给了我闪烁的伪影。首先,我需要确定所有变量似乎都是常量,并且使用以下着色器确定它们的值: float4 src_rect : register(c0); float4 main(float2 uv : TEXCOORD) : COLOR { float2 uvmin = {src_rect.x, src_rect.z}; float2 uvmax = {src_rect.y, src_rect.w}; float
float4 src_rect : register(c0);
float4 main(float2 uv : TEXCOORD) : COLOR {
float2 uvmin = {src_rect.x, src_rect.z};
float2 uvmax = {src_rect.y, src_rect.w};
float2 uv1 = (uv - uvmin)/(uvmax - uvmin);
float4 c = 1;
c.rgb = 0;
if (uv.x == 639)
c.rg = 1;
else if (uv.y == 359)
c.g = 1;
else if (uv.y == 0)
c.b = 1;
else if (uv.x == 0)
c.gb = 1;
else {
if ((uvmin.x == 0) && (uvmin.y == 0)
&& (uvmax.x == 640) && (uvmax.y == 360))
c.rgb = float3(1, 0, 0);
}
return c;
}
以下是此着色器的输出:
所以uvmin={0,0}和uvmax={640,360}。左上角的像素uv为(0,0),右下角的像素uv为(639359)。这里有一个着色器再现了我的问题:
float4 src_rect : register(c0);
float4 main(float2 uv : TEXCOORD) : COLOR {
float2 uvmin = {src_rect.x, src_rect.z};
float2 uvmax = {src_rect.y, src_rect.w};
float2 uv1 = (uv - uvmin)/(uvmax - uvmin);
float4 c = 1;
c.rgb = 0;
if (uv.x == 639)
c.rg = 1;
else if (uv.y == 359)
c.g = 1;
else if (uv.y == 0)
c.b = 1;
else if (uv.x == 0)
c.gb = 1;
else {
c.rgb = frac(floor(uv1.x*1.001)*9.999);
}
return c;
}
此着色器的输出生成以下输出,但白色部分会闪烁黑白:
如果将uvmin和uvmax的值作为常量插入,则问题不再发生。以下是着色器:
float4 src_rect : register(c0);
float4 main(float2 uv : TEXCOORD) : COLOR {
float2 uvmin = {0, 0};
float2 uvmax = {640, 360};
float2 uv1 = (uv - uvmin)/(uvmax - uvmin);
float4 c = 1;
c.rgb = 0;
if (uv.x == 639)
c.rg = 1;
else if (uv.y == 359)
c.g = 1;
else if (uv.y == 0)
c.b = 1;
else if (uv.x == 0)
c.gb = 1;
else {
c.rgb = frac(floor(uv1.x*1.001)*9.999);
}
return c;
}
StackOVerflow不允许我包含到输出的链接,但它与初始图像相同,但使用黑色而不是红色。在您的问题中有一种方法可以减少信息量。可能是范围问题(即,
src\u rect
以像素为单位测量,uv
以规范化坐标\in[0,1]
为单位测量)。如果返回float4(0,1,0,1)代码>它是在黑色和绿色之间闪烁,还是发生了其他事情?@MooseBoys如果我返回一个常量,屏幕不会闪烁。@Nico Schertler uv和src\u rect都以像素为单位。你可以用一个。