我目前正在学习将更多材料应用于我的应用程序,但后来我对如何扩展它感到困惑。我正在使用WebGL,我正在从learningwebgl.com学习(他们说这与NeHe OpenGL教程相同),它只显示简单的着色器程序,每个样本都有一个带嵌入式照明的程序。
假设我有多个灯光设置,比如一些点灯/聚光灯,我有多个不同材质的网格,但每个网格需要对这些灯光做出反应。我该怎么办?制作单独的着色器程序,将颜色/纹理放入网格,然后切换到照明程序?或者总是将我的应用程序中的每个着色器字符串与那些灯(作为函数)一起作为默认值,将其附加到已加载的着色器,并简单地进行变量传递以启用它们?
此外,我专注于每片段照明,所以也许事情只发生在碎片着色器中。
答案 0 :(得分:1)
通常有2个approches
有一个超级着色器
在这种情况下,您可以使用每个选项制作一个大的着色器,并使用大量分支或方法来有效地使着色器的某些部分无效(例如乘以0)
一个简单的例子可能是在着色器中有一组灯制服。对于灯光,你不想产生影响,你只需将它们的颜色设置为0,0,0,0或将它们的功率设置为0,这样它们仍然可以计算,但它们对最终场景没有贡献。
动态生成着色器
在这种情况下,对于每个模型,您可以找出该着色器所需的选项,并使用您需要的确切功能生成相应的着色器。
#2的变体是相同的,但所有需要的着色器都是离线生成的。
大多数游戏引擎使用技术#2,因为使用每种情况下最小的着色器比运行超级着色器效率更高,但许多小型项目甚至游戏原型通常使用超级着色器,因为它更容易生成着色器。特别是如果你还不知道你需要的所有选项。