让我们考虑这种情况。场景包含给定对象:ABCDE
哪里从相机订购(从最近到最远) AEBDC
而物体AC使用shader1,ED shader 2,B shader3
对象 AC 使用羞耻着色器但不同的纹理。
现在如何处理这种情况?
- 从前到后渲染所有内容(5 次交换)
- 按排序的着色器组渲染(3 个着色器交换)。
- 将所有着色器程序调整为一个(1 个交换)。
glUniform
诸如等glBindTexture
更改已在使用程序中的值的指令是否会导致开销?
让我们考虑这种情况。场景包含给定对象:ABCDE
哪里从相机订购(从最近到最远) AEBDC
而物体AC使用shader1,ED shader 2,B shader3
对象 AC 使用羞耻着色器但不同的纹理。
现在如何处理这种情况?
glUniform
诸如等glBindTexture
更改已在使用程序中的值的指令是否会导致开销?
这个问题没有一个答案。更改 OpenGL 状态是否“导致开销”?他们当然会;没有什么是免费的。问题是状态变化引起的开销是否会比不太有效的深度测试支持更糟糕。
这是无法回答的,因为答案取决于有多少透支、片段着色器的成本、特定的绘制调用序列需要多少状态更改,以及许多其他事先无法知道的无形因素。
这就是为什么在优化之前进行分析很重要的原因。
个人资料,个人资料,甚至更多个人资料:)
不过我想补充一件事:
在您的情况下,您可以使用渲染队列的想法。它是某种用于绘制对象的管理器。而不是绘制您调用的对象renderQueue.add(myObject)
。然后,当你add()
需要所有需要的对象时,你可以调用renderQueue.renderAll()
. 此方法可以处理所有排序(按距离、按着色器、按材质等),这样在分析(然后更改渲染方式)时它会更有用。
当然,这只是一个粗略的想法。