HLSL Shader Model 4.1中的动态分支

时间:2014-07-17 15:10:33

标签: shader direct3d hlsl vertex-shader direct3d11

我似乎无法在任何地方找到确凿的答案,所以也许这里有人可以提供帮助。我正在为Direct3D 11构建一个顶点着色器(HLSL Shader Model 4.1),为了减少我需要做的绘制调用的数量,我希望这个着色器根据一个标志执行两个分支中的任何一个。

伪代码:

if (flag)
    calculate corners of axis aligned quad
else
    calculate corners of rotated quad
end if

我一直在阅读着色器执行两个分支并在之后选择适当的结果(这意味着它很昂贵并且使用两个不同的着色器(以及更多绘制调用)可能会更好),但是在较新的着色器中这可能会有所不同模型(只执行相关分支,这意味着我实际上可以免费获得灵活性)。 Shader Model 4.1的情况如何?

对于像素着色器,显然每个像素组执行分支(这可能会影响执行的分支),但是如何在顶点着色器中工作?

1 个答案:

答案 0 :(得分:1)

您为HLSL编译器提供了MSDN页面上提到的关于是否要使用动态分支或静态分支的提示:

[branch] if (flag)
    calculate corners of axis aligned quad
else
    calculate corners of rotated quad
end if

[flatten] if (flag)
    calculate corners of axis aligned quad
else
    calculate corners of rotated quad
end if

很难完全概括这样的性能建议,它实际上取决于着色器,目标硬件以及代码如何与着色器交互的细节。一般来说,静态分支是首选,但对于较新的SM 4.0+模型而言,这并不像SM 2.0 / 3.0时那样重要。