每个对象都应该有自己的着色器吗?

Should every object have its own shader?

假设我有 4 个相同的对象 -(网格或精灵), 他们都(可能)拥有相同的 shader/program,因为他们是相同的。

每个都有自己的位置,并在单独的渲染调用中渲染。

这些对象的位置偶尔会发生变化,但不是每一帧都会发生变化。

我不知道处理这个问题最快的方法是什么:

  1. 每个对象都有自己的着色器,变换存储在着色器中(GPU 端)?我需要每帧重新绑定 4 个着色器。当我想移动某个对象时,我只需绑定正确的着色器并将新的变换矩阵发送给它。

  2. 所有这些对象只有一个 shader/program 绑定?转换存储在 class(CPU 侧)。每次我渲染这些对象之一时,我必须将它的变换发送到着色器,所以我每帧发送 4 个矩阵。当我想移动某个对象时,我只需更改它的值 class,但不需要向 GPU 发送任何内容。

  3. 还有其他更好的解决方案吗?

选项 2 是您希望的处理方式。绑定新的着色器程序相当昂贵,理想情况下,您希望在移动到下一个着色器之前尽可能多地使用一个着色器进行渲染。

至于每帧发送 4 个矩阵,我假设其中 3 个矩阵是您的 MVP 矩阵——模型、视图、投影。如果您考虑一下,对于单批渲染调用,视图和投影矩阵将是相同的,因此这些应该只在渲染函数中设置一次,然后您可以循环遍历您的网格,并且只更新模型绘制前的矩阵。这样您就可以限制 OpenGL 状态更改的次数,从而获得更好的性能。