【问题标题】:Why do we need dynamic branch to render multiple light sources为什么我们需要动态分支来渲染多个光源
【发布时间】:2017-04-07 09:19:39
【问题描述】:

我正在阅读实时渲染(第三版)。在第 7.9 节组合灯光和材质中,它说“如果不使用动态分支,则需要为每个可能的灯光和材质类型组合生成不同的着色器”。

我认为静态分支非常适合这个问题。对吗?

【问题讨论】:

    标签: directx rendering shader


    【解决方案1】:

    大概您的“引擎”代码正在确定场景中的灯光和材质类型,并且(通常)是动态的。要将其传达给您的着色器,您需要以某种方式传递信息 - 通过制服、纹理或缓冲区。该数据不是静态的,因此,任何基于其中包含的信息的条件表达式都是动态分支。

    一些图形 API/驱动程序会在底层进行优化,并从本质上使用预测的多个分支重新编译您的着色器,并将其称为“静态分支”。例如,D3D9 的着色器文档指出:

    静态分支允许打开或关闭着色器代码块 基于布尔着色器常量。

    在 OpenGL 等其他 API 中,并没有很好地宣传这些优化何时发生,尽管可能确实发生了。它也可能(将)因驾驶员而异。但是,自己编写组合要可靠得多,这样您就知道正在使用哪种类型的分支(没有!)。

    如果您的场景有不变的灯光和材质,那么您可以在着色器中“硬编码”灯光和材质类型(例如常量)。然而,这实际上是引用的意思 - 您可以使用静态分支,但需要为灯光和材质的每种组合生成不同的着色器。

    【讨论】:

    • 但是在本书第3.2节可编程着色器阶段的末尾,它说基于uniforms值的分支实际上是静态分支。我认为这种分支不同于基于纹理数据等动态源的值的分支。
    • 我猜你可能会争辩说,如果你使用静态分支,那么驱动程序很可能会为引擎盖下的每个组合生成不同的着色器,所以引用可能仍然是正确的。
    • 用一些关于静态分支优化的内容更新了我的答案。
    • @Columbo 在常量缓冲区中基于 bool 的不同着色器不太可能,因为 dx11 硬件,只要波道都遵循相同的路径,GPU 分支几乎是空闲的。它甚至在 DX12 中强制执行,因为它是按设计在 CreatePipeline 而不是其他地方进行的编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多