Directx HLSL着色器中的不确定性瑕疵

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

我有一个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};
    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都以像素为单位。你可以用一个。