shader - 是否可以跳过像素着色器中的颜色输出?

标签 shader direct3d hlsl

我正在编写 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;
}

最佳答案

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

关于shader - 是否可以跳过像素着色器中的颜色输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16673670/

相关文章:

swift - SCNProgram 不影响 SCNFloor

include - HLSL #pragma 一次等效?

GLSL vec2 用作 float 组?

opengl - 如何获得准确的片段屏幕位置,如顶点着色器中的 gl_FragCoord?

glsl - 在统一分支内有一个非绑定(bind)采样器

c++ - DirectX:在视口(viewport)中放大绘制位图图像导致质量低下?

c++ - DirectX 9 或 10 覆盖

crash - DirectX 应用程序导致计算机崩溃

c++ - 如何使用着色器将顶点着色为网格(如线框模式)?

directx-11 - 一次渲染到完整的 3D 渲染目标