Answers:
您应该将着色器程序视为状态与纹理类似的部分。更改状态非常昂贵,因此您可以避免将多个纹理组合为一个以避免纹理更改。着色器也是如此-您可以组合多个着色器以避免状态更改。
与合并纹理类似,合并着色器也会带来开销-如果仅从4096x4096纹理中渲染16x16像素区域,则不会有效使用硬件。同样,如果渲染的对象仅使用着色器中的代码的10%,则图形卡可能(甚至可能)不必要地计算了很多内容。
简而言之,“取决于”。
最好使事情尽可能简单。为每个对象复制相同的着色器是不必要的,并且很快会变得肿。您也不想让一个巨大的着色器覆盖所有可能的用例,因为这会导致不必要的开销。
关于着色器管理,有几种意见,但没有“最佳”方法来实现。我什至看过一些着色器实现,其中每个着色器都是根据关闭的参数即时生成的(例如,在虚幻引擎中))。
对于刚开始涉足此领域的人来说,最好先画出基本着色器。例如,我有一个用于无纹理对象的着色器,一个具有基本纹理和按像素照明支持的着色器,等等。然后,每次我想要使用以前的着色器无法实现的不同效果时,我为新效果创建一个新的。
这种系统的目的是使事情保持简单。只是。保持。它。简单。