我正在阅读Real-Time Rendering(第三版)。在第7.9节“组合灯光和材质”中,它表示"如果未使用动态分支,则需要为每种可能的灯光和材质类型组合生成不同的着色器"。
我认为静态分支非常适合这个问题。是吗?
答案 0 :(得分:0)
据推测,您的“引擎”代码正在确定场景中哪种灯光和材质,而且(通常)是动态的。要将此信息传达给着色器,您需要以某种方式传递信息 - 通过制服,纹理或缓冲区。该数据不是静态的,因此,基于其中包含的信息的任何条件表达式都是动态分支。
某些图形API /驱动程序在底层进行优化,并且基本上重新编译具有预测的多个分支的着色器,并将其称为“静态分支”。例如,D3D9的着色器文档,它声明:
静态分支允许打开或关闭着色器代码块 基于布尔着色器常量。
在其他API(如OpenGL)中,当这些优化发生时,它并没有得到很好的宣传,尽管可能它们确实发生了。它也可能(将)与驱动程序不同。但是,自己编写组合会更加可靠,这样你就知道正在使用什么类型的分支(没有!)。
如果您的场景具有不变的灯光和材质,那么您可以在着色器中“硬编码”灯光和材质类型(比如常量)。然而,这基本上就是引用所说的 - 你可以使用静态分支,但是需要为每种灯光和材料组合生成不同的着色器。