所以我分批渲染我的场景,试图最小化状态变化。 由于我的着色器通常需要多个纹理,因此我将其中一些纹理单元同时绑定到不同的纹理单元。其中一些纹理在多个批次中使用,因此甚至可以保持约束。
现在我的问题是,在批处理中重新绑定我需要的所有纹理是否正常,即使它们中的一些可能已被绑定?或者我应该检查哪些是绑定的,只绑定新的? glBindTexture有多贵?我正在使用着色器,将未使用的纹理绑定到着色器不会从中采样的纹理单元是不是很糟糕,或者我应该将它们解除绑定?
我主要问“如何快速”,而不是“如何”。
编辑:如果我提供代码会有帮助吗?
答案 0 :(得分:12)
GPU编程的神圣规则是,你越少与GPU交谈,她就越爱你。 glBindTexture比CPU上的单一条件检查要贵得多,因此对于频繁的状态更改,我认为你应该看看是否需要将新的纹理索引传递给GPU。
答案 1 :(得分:4)
答案很难,因为任何强大的GL实现都应该将已经绑定的纹理绑定为无操作作为优化。您应该尝试进行基准测试,看看条件是否有所作为。
同样适用于纹理单元中未使用的纹理,因为GL实现确实知道最终使用了什么纹理单元,它不应该影响具有未使用纹理单元的性能(作为优化)。
答案 2 :(得分:0)
跟踪您已绑定的纹理(不使用glGet(GL_TEXTURE_BINDING_2D))并仅在其更改时重新绑定。有些司机会为你做这件事,有些人不会。
如果你知道自己提前定位的平台,那么做一个简单的基准测试很容易看出它有多大差异。
您还可以根据它们使用的纹理对批次进行排序,以最大限度地减少纹理更改。
答案 3 :(得分:0)
我会说最好的方法是使用glBindTextures https://www.khronos.org/opengl/wiki/GLAPI/glBindTextures一次绑定所有纹理。或使用无约束纹理:)