GLSL,全部包含在一个或多个着色器程序中?


17

我正在使用OpenGL进行一些3D演示,我注意到GLSL有点“受限”(或者仅仅是我吗?)。无论如何,我有许多不同类型的材料。某些材质具有环境和漫反射颜色,某些材质具有环境光遮挡贴图,某些材质具有镜面贴图和凹凸贴图等。

是最好在一对顶点/片段着色器对中支持所有对象,还是更好地创建许多顶点/片段着色器并根据当前选择的材质进行选择?OpenGL或D3D中通常的着色器策略是什么?



这是错误的二分法,您必须选择一种或另一种方法来管理着色器。在该行业的十五年中,我从未参与过一个坚持任何极端的项目,但始终在两种管理着色器的方法之间取得平衡,并在合理的情况下使用每种方法。
特雷弗·鲍威尔

Answers:


12

答案是,这要看情况。

基本上有两种思想流派。适用于所有事物和超级着色器阵营的小型最佳着色器。

小着色器就是这样。做一件事,并做好。Uber着色器要么在运行时通过制服控制其功能,要么通过预处理器宏(和/或生成的着色器源)编译为一堆不同的着色器。

最佳解决方案可能既不是,也不是某种混合。在某些情况下,也许一些超级着色器或超级着色器与专用着色器结合在一起。

小型着色器

优点:

  • 可能更快/更优化
  • 只是您想要它做什么
  • 可以轻松地完成奇怪的自定义内容

缺点:

  • 容易失控,特别是当功能数量增加时
  • 除非您的着色器数量很少,否则可能需要更多工作

优步着色器

优点:

  • 一切都集中在一处
  • 对艺术家更友好(第一次将功能A与功能X结合使用并不一定需要编码时间)

缺点:

  • 着色器编译时间更长
  • 最佳效果较差(尤其是如果使用制服打开/关闭功能部件)
  • 可能更难调试/优化

Uber-shader在这种表示形式中不是一件好事:)我建议基于预定义编写好的着色器管理器-因此我们将拥有带有许多#ifdefs的uber-shader代码,可以针对各种材质进行切换。
brigadir 2012年

2
我还要补充说,超级着色器的另一个优点是切换着色器会降低性能,因此,如果切换频率较低,则可能会提高性能。
Jherico '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.