Opengl 前后渲染与着色器交换 让我们考虑一下这种情况。 场景包含给定的对象:ABCDE
从摄像机订购的位置(从最近到最远) AEBDC 和对象AC使用着色器1、ED着色器2、B着色器3 对象AC使用羞愧着色器,但纹理不同 现在该怎么处理这种情况呢Opengl 前后渲染与着色器交换 让我们考虑一下这种情况。 场景包含给定的对象:ABCDE,opengl,rendering-engine,Opengl,Rendering Engine,从摄像机订购的位置(从最近到最远) AEBDC 和对象AC使用着色器1、ED着色器2、B着色器3 对象AC使用羞愧着色器,但纹理不同 现在该怎么处理这种情况呢 从前面到后面渲染所有内容(5次交换) 按已排序的着色器组渲染(3个着色器交换) 将所有着色器程序设置为一个(1次交换) 像glUniform,glBindTexture等指令更改已使用程序中的值是否会导致开销?这个问题没有一个答案。更改OpenGL状态是否会“导致开销”?当然有,;没有什么是免费的。问题是,由状态更改引起的开销是否会比
- 从前面到后面渲染所有内容(5次交换)
- 按已排序的着色器组渲染(3个着色器交换)
- 将所有着色器程序设置为一个(1次交换)
像
glUniform
,glBindTexture
等指令更改已使用程序中的值是否会导致开销?这个问题没有一个答案。更改OpenGL状态是否会“导致开销”?当然有,;没有什么是免费的。问题是,由状态更改引起的开销是否会比低效的深度测试支持更糟糕
这是无法回答的,因为答案取决于透支的程度、片段着色器的成本、特定绘制调用序列需要多少状态更改,以及许多其他无法事先知道的无形资产
这就是为什么优化前的评测非常重要。评测、评测甚至更多评测:) 不过,我想补充一点: 在您的情况下,可以使用渲染队列的概念。它是图形对象的某种管理器。而不是绘制您调用的对象
renderQueue.add(myObject)
。然后,当您add()
所有需要的对象时,您可以调用renderQueue.renderAll()
。此方法可以处理所有排序(按距离、按着色器、按材质等),这样在分析(然后更改渲染方式)时更有用
当然,这只是一个粗略的想法