我一直在编写一些代码来检查当前是否绑定了纹理、缓冲区或着色器,如果绑定了,则避免绑定两次。
if (lastShaderBound != shaderName) {
lastShaderBound = shaderName);
glUseProgram(shaderName);
}
然而,有一个潜在的陷阱;如果这些对象中的任何一个在绑定时被删除,OpenGL将隐式地解除它们的绑定,并允许它们的GLuint
名称被重用。这可能导致我的绑定“状态”与OpenGL的“状态”不同(除非我尝试复制这个行为,这是相当复杂的)。
我想知道这些是否都是必要的?如果OpenGL足够聪明,可以解除已删除缓冲区的绑定,也许它已经在做我想做的事情了,或者可能不是绑定调用一开始就很昂贵?
我应该自由地绑定东西,而不用担心同一个东西被连续多次绑定吗?
1条答案
按热度按时间ktca8awb1#
从技术上讲,再次绑定相同的材质球或纹理是合法的。
会有与绑定管理费用或分支相关的成本。
考虑以下代码
如果我使用分支条件,我将比一次又一次绑定着色器(非常基本的着色器程序)少2000-3000纳秒。
但这将根据着色器的不同而有所不同。
在我的平台上,分支比再次绑定着色器更便宜,但为了实现这种差异,我必须至少进行1000次迭代。