如何制作一个没有分支的“冰山”着色器

问题描述 投票:0回答:1

出于学习目的,我使用 DirectX 12 创建了一个简单的图形程序。我听说在着色器代码中使用 If 语句对性能不利。然而,我无法理解如何在不使用

if
语句的情况下实现所附图像的效果。

这是我的代码:

float4 WaterPixelShader(PixelInput _in) : SV_Target
{    
    float heigth = _in.worldPosition.y / 10;
    float white;

    if (heigth > 0.7)
    {
        white = 1;
    }
    else
    {
        white = 0;
    }
    return float4(white, white, heigth, 1);
}

这就是我想要达到的效果:

Icy mountain

shader fragment-shader directx-12 branchless
1个回答
0
投票

如何使用布尔值本身作为整数并转换为

float
。 GPU 的类型转换速度通常比分支速度快得多。

float4 WaterPixelShader(PixelInput pixelInput) : SV_Target
{    
    float height = pixelInput.worldPosition.y / 10;
    float white = (float)(height > 0.7);
    return float4(white, white, height, 1);
}
© www.soinside.com 2019 - 2024. All rights reserved.