从前到后渲染与着色器交换

时间:2013-07-24 16:44:16

标签: opengl rendering-engine

让我们考虑一下这种情况。 场景包含给定的对象:ABCDE

从相机订购的地方(从最近到最远) AEBDC

对象AC使用shader1,ED着色器2,B shader3

对象AC使用羞耻着色器但纹理不同。

现在该怎么处理这种情况?

  • 从前到后渲染所有内容(5个交换)
  • 按着色组渲染(按3个着色器交换)。
  • 将所有着色器程序设为一个(1个交换)。

glUniformglBindTexture等指示改变已使用程序中的值会导致开销吗?

2 个答案:

答案 0 :(得分:4)

这个问题没有一个答案。更改OpenGL状态是否“导致开销”? 当然他们这样做;没有什么是免费的问题是由状态变化引起的开销是否会比不太有效的深度测试支持更差。

这是无法回答的,因为答案取决于有多少透支,你的片段着色器有多昂贵,特定的绘制调用序列需要多少状态变化,还有许多其他事先无法知道的无形资产。 / p>

这就是为什么在优化之前分析非常重要。

答案 1 :(得分:1)

个人资料,个人资料以及更多资料:)

我想补充一点:

在您的情况下,您可以使用渲染队列的想法。它是绘制对象的某种管理器。您可以调用renderQueue.add(myObject)而不是绘制对象。然后,当您add()所有需要的对象时,您可以调用renderQueue.renderAll()。此方法可以处理所有排序(通过距离,着色器,材料等),这样在分析(然后更改渲染方式)时它会更有用。

当然这只是一个粗略的想法。