【发布时间】:2017-04-07 09:19:39
【问题描述】:
我正在阅读实时渲染(第三版)。在第 7.9 节组合灯光和材质中,它说“如果不使用动态分支,则需要为每个可能的灯光和材质类型组合生成不同的着色器”。
我认为静态分支非常适合这个问题。对吗?
【问题讨论】:
我正在阅读实时渲染(第三版)。在第 7.9 节组合灯光和材质中,它说“如果不使用动态分支,则需要为每个可能的灯光和材质类型组合生成不同的着色器”。
我认为静态分支非常适合这个问题。对吗?
【问题讨论】:
大概您的“引擎”代码正在确定场景中的灯光和材质类型,并且(通常)是动态的。要将其传达给您的着色器,您需要以某种方式传递信息 - 通过制服、纹理或缓冲区。该数据不是静态的,因此,任何基于其中包含的信息的条件表达式都是动态分支。
一些图形 API/驱动程序会在底层进行优化,并从本质上使用预测的多个分支重新编译您的着色器,并将其称为“静态分支”。例如,D3D9 的着色器文档指出:
静态分支允许打开或关闭着色器代码块 基于布尔着色器常量。
在 OpenGL 等其他 API 中,并没有很好地宣传这些优化何时发生,尽管可能确实发生了。它也可能(将)因驾驶员而异。但是,自己编写组合要可靠得多,这样您就知道正在使用哪种类型的分支(没有!)。
如果您的场景有不变的灯光和材质,那么您可以在着色器中“硬编码”灯光和材质类型(例如常量)。然而,这实际上是引用的意思 - 您可以使用静态分支,但需要为灯光和材质的每种组合生成不同的着色器。
【讨论】: