我应该使用多少个OpenGL程序来渲染多个对象?


10

我的场景中有多个对象。(假设3个立方体,1个圆柱体,8个球体。)我假设我应该为每个立方体创建一个顶点着色器。我应该有几个程序?

备择方案:

  • 每个对象一个程序
  • 一个程序用于所有立方体,另一个程序用于所有球体(假定它们使用相同的着色器)
  • 一个适用于一切的大型程序

正确的方法是什么?


1
“我认为我应该为每个对象创建一个顶点着色器。” 你为什么要这样?顶点着色器将根据您的模型转换顶点并查看矩阵,您几乎总是希望它对所有内容都相同。
2014年

Answers:


8

您应该将着色器程序视为状态与纹理类似的部分。更改状态非常昂贵,因此您可以避免将多个纹理组合为一个以避免纹理更改。着色器也是如此-您可以组合多个着色器以避免状态更改。

与合并纹理类似,合并着色器也会带来开销-如果仅从4096x4096纹理中渲染16x16像素区域,则不会有效使用硬件。同样,如果渲染的对象仅使用着色器中的代码的10%,则图形卡可能(甚至可能)不必要地计算了很多内容。

简而言之,“取决于”。


4
此外,在许多情况下,您只能使用一个着色器。差异仅在制服传递给着色器一样,颜色,纹理,法线贴图等
rioki

是的,例如,您可能有一个“ Scaly”着色器,该着色器生成看起来有鳞片的片段,并且以某种方式工作(大多数着色器都可以...),您可以使用该方式渲染所有3个立方体,1个圆柱体和8个球体一个着色器(当然具有相应的几何图元)。这里的一组合理的制服可能是定义颜色的矢量值,并且可能是一些标量或影响视觉效果“有鳞”或“发亮”的东西。然后,您将拥有一个着色器,并通过更改各个几何图形之间的均匀性来更改着色器为片段着色的方式。
史蒂文·卢

5

最好使事情尽可能简单。为每个对象复制相同的着色器是不必要的,并且很快会变得肿。您也不想让一个巨大的着色器覆盖所有可能的用例,因为这会导致不必要的开销。

关于着色器管理,有几种意见,但没有“最佳”方法来实现。我什至看过一些着色器实现,其中每个着色器都是根据关闭的参数即时生成的(例如,在虚幻引擎中))。

对于刚开始涉足此领域的人来说,最好先画出基本着色器。例如,我有一个用于无纹理对象的着色器,一个具有基本纹理和按像素照明支持的着色器,等等。然后,每次我想要使用以前的着色器无法实现的不同效果时,我为新效果创建一个新的。

这种系统的目的是使事情保持简单。只是。保持。它。简单。


+1是因为您提到了当前行业的状况。
Krythic
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.