2

我正在编写一个 PixelShader (HLSL, SM40) 并尝试在某些情况下完全跳过输出。我当前的代码如下所示:

float4 PS( PS_INPUT input) : SV_Target
{
    float4 result=float4(1,1,1,0);
    if(input.Col.r >= 0.999998f)
        result=float4(0,0,0,0);
    return result;
}

但这只会写出看不见的黑色像素(因为这里的黑色是背景色)。但在某些情况下,如果像素先前已着色,则像素会明显变黑。我的意图是跳过写入渲染目标。有没有办法跳过这个,例如代码可能看起来像这个不工作的:

float4 PS( PS_INPUT input) : SV_Target
{
    float4 result=float4(1,1,1,0);
    if(input.Col.r >= 0.999998f)
        return; //or 'return null;'
    return result;
}

编辑- 现在我们有一个工作(未优化以保持可比性)示例:

float4 PS( PS_INPUT input) : SV_Target
{
    float4 result=float4(1,1,1,0);
    if(input.Col.r >= 0.999998f)
        discard;
    return result;
}
4

1 回答 1

5

这可以通过内部函数clip( doc ) 或流控制语句discard( doc ) 来实现。在你的情况下clip应该最适合:)

于 2013-05-21T18:16:26.413 回答