Opengl 前后渲染与着色器交换 让我们考虑一下这种情况。 场景包含给定的对象:ABCDE

Opengl 前后渲染与着色器交换 让我们考虑一下这种情况。 场景包含给定的对象:ABCDE,opengl,rendering-engine,Opengl,Rendering Engine,从摄像机订购的位置(从最近到最远) AEBDC 和对象AC使用着色器1、ED着色器2、B着色器3 对象AC使用羞愧着色器,但纹理不同 现在该怎么处理这种情况呢 从前面到后面渲染所有内容(5次交换) 按已排序的着色器组渲染(3个着色器交换) 将所有着色器程序设置为一个(1次交换) 像glUniform,glBindTexture等指令更改已使用程序中的值是否会导致开销?这个问题没有一个答案。更改OpenGL状态是否会“导致开销”?当然有,;没有什么是免费的。问题是,由状态更改引起的开销是否会比

从摄像机订购的位置(从最近到最远) AEBDC

和对象AC使用着色器1、ED着色器2、B着色器3

对象AC使用羞愧着色器,但纹理不同

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

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

glUniform
glBindTexture
等指令更改已使用程序中的值是否会导致开销?

这个问题没有一个答案。更改OpenGL状态是否会“导致开销”?当然有,;没有什么是免费的。问题是,由状态更改引起的开销是否会比低效的深度测试支持更糟糕

这是无法回答的,因为答案取决于透支的程度、片段着色器的成本、特定绘制调用序列需要多少状态更改,以及许多其他无法事先知道的无形资产


这就是为什么优化前的评测非常重要。

评测、评测甚至更多评测:)

不过,我想补充一点:

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

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