可以两次绑定同一个OpenGL对象吗?

brjng4g3  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(172)

我一直在编写一些代码来检查当前是否绑定了纹理、缓冲区或着色器,如果绑定了,则避免绑定两次。

if (lastShaderBound != shaderName) {
    lastShaderBound = shaderName);
    glUseProgram(shaderName);
}

然而,有一个潜在的陷阱;如果这些对象中的任何一个在绑定时被删除,OpenGL将隐式地解除它们的绑定,并允许它们的GLuint名称被重用。这可能导致我的绑定“状态”与OpenGL的“状态”不同(除非我尝试复制这个行为,这是相当复杂的)。

我想知道这些是否都是必要的?如果OpenGL足够聪明,可以解除已删除缓冲区的绑定,也许它已经在做我想做的事情了,或者可能不是绑定调用一开始就很昂贵?

我应该自由地绑定东西,而不用担心同一个东西被连续多次绑定吗?

ktca8awb

ktca8awb1#

从技术上讲,再次绑定相同的材质球或纹理是合法的。

会有与绑定管理费用或分支相关的成本。

考虑以下代码

QElapsedTimer elapsetimer;
    elapsetimer.start();
    ResourceManager::GetShader("Screen").Use();  // glUseProgram(this->ID);
    for (int i = 0; i < 1000; i++) {
        if (ResourceManager::GetShader("Screen").ID != id)
            ResourceManager::GetShader("Screen").Use();
    }

    qDebug() << elapsetimer.nsecsElapsed();

如果我使用分支条件,我将比一次又一次绑定着色器(非常基本的着色器程序)少2000-3000纳秒。

但这将根据着色器的不同而有所不同。

在我的平台上,分支比再次绑定着色器更便宜,但为了实现这种差异,我必须至少进行1000次迭代。

相关问题