在我的引擎中,我有很多着色器来处理指定的纹理组合,例如DiffTexShader,NoTexShader,DiffTexNormalMapShader,DiffTexLightmapShader等。
现在我想添加阴影映射效果。什么更好?在单独的通道中进行阴影映射,然后将原始场景与仅阴影场景组合在一起是否更好?或者最好复制我所有的着色器并使它们能够使用阴影贴图来克隆阴影?
我认为第一种方法更好维护(只有一个额外的着色器用于渲染阴影),但比第二种方法慢得多。
这是着色器的普遍问题:有一个巨大的超级着色器,只需设置标志: - 启用纹理,启用NormalMap,启用灯光,然后在代码中
if (enableTexturing) {
}
if (enableLights) {
}
或者像您一样使用单独的着色器。我不会单独传球,因为它会极大地损害性能。
在 glsl 中,您可以在函数内实现阴影,并将此函数作为另一个着色器附加到程序中。这样,程序中的其他着色器将可以看到它。
以下是另一个类似的问题:
- https://gamedev.stackexchange.com/questions/1512/what-is-a-good-alternative-to-unified-shader-for-shadows
- https://gamedev.stackexchange.com/questions/34883/glsl-all-in-one-or-many-shader-programs