【问题标题】:Dynamic branching in HLSL Shader Model 4.1HLSL Shader Model 4.1 中的动态分支
【发布时间】:2014-07-17 15:10:32
【问题描述】:

我似乎无法在任何地方找到明确的答案,所以也许这里有人可以提供帮助。我正在为 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 是什么情况?

当涉及到像素着色器时,显然每个像素组都会执行分支(这可能会影响执行的分支),但是在顶点着色器中这将如何工作?

【问题讨论】:

标签: shader direct3d hlsl vertex-shader direct3d11


【解决方案1】:

MSDN 页面上所述,您向 HLSL 编译器提供了关于您要使用动态分支还是静态分支的提示:

[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 时代那样重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多