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