2017-04-07 43 views
1

我正在阅读Real-Time Rendering(第三版)。在第7.9节“组合灯光和材料”中,它说“如果不使用动态分支,则需要为每种可能的灯光和材料类型组合生成不同的着色器”。为什么我们需要动态分支来渲染多个光源

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

回答

0

假设你的'引擎'代码是确定你的场景中哪种灯光和材料,并且(通常)是动态的。为了与您的着色器沟通,您需要以某种方式传递信息 - 通过制服,纹理或缓冲区。该数据不是静态的,因此,基于其中包含的信息的任何条件表达式都是动态分支。

某些图形API /驱动程序在底层进行了优化,基本上重新编译了预测多个分支的着色器,并将其称为“静态分支”。例如,对于D3D9着色器文档,它指出:

静态分支允许的着色器代码块为开或关 基于布尔着色器常数切换。

在其他API(如OpenGL)中,虽然可能发生这种优化,但它在发生这种优化时并没有很好地公布。它也可能(将)不同于驾驶员。但是,自己编写组合的方法要可靠得多,这样你就知道使用了什么类型的分支(没有!)。

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

+1

但在第3.2节“本书的可编程着色器阶段”的末尾,它说基于制服值的分支实际上是静态分支。我认为这种分支不同于基于纹理数据等动态源值的分支。 – delphifirst

+0

我想你可能会争辩说,如果你使用静态分支,那么驱动程序可能会为引擎盖下的每个组合产生不同的着色器,所以报价可能仍然是正确的。 – Columbo

+0

更新了一些关于静态分支优化的答案。 – MuertoExcobito