首页 > 解决方案 > 在openGL中多次绑定缓冲区

问题描述

在学习 opengl时,有点困惑是是否需要多次绑定 VAO 或纹理 ID 等缓冲区而不解除绑定?

参考上面的链接和完整的源代码,我遇到了两个有点不同的场景。

首先,作者创建了一个 VAO(在 maindraw 循环之外)并使用 绑定 VAO, glBindVertexArray(VAO)然后他没有使用 取消绑定它glBindVertexArray(0);,但他在 maindraw 循环中再次绑定它。我的困惑,这真的有必要吗?当前绑定的 VAO 不是已经……绑定了吗?当它已经是活动的 VAO 时,为什么还要绑定它?

和,

其次,作者使用以下方法创建纹理 ID:

glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);  
//some more code
glGenTextures(1, &texture2);
glBindTexture(GL_TEXTURE_2D, texture2);

在主绘制循环之外,但在主绘制循环内再次执行此操作:*

 glActiveTexture(GL_TEXTURE0);
 glBindTexture(GL_TEXTURE_2D, texture1);
 glActiveTexture(GL_TEXTURE1);
 glBindTexture(GL_TEXTURE_2D, texture2);

我不明白他所做的两件事是:

  1. 当他在主循环之外完成后,为什么他在主循环中再次绑定纹理ID?(这个类似于VAO,但我不知道是否可以在这里取消绑定)
  2. 为什么他选择glActiveTexture循环内的活动纹理单元(使用)?不能在主绘制循环之外完成吗?

标签: c++opengl

解决方案


glBindTexture将纹理绑定到指定目标和当前纹理单元。当前纹理单元由 设置glActiveTexture。当前纹理单元是全局状态,并glBindTexture考虑该状态。

那意味着当你这样做的时候

glBindTexture(GL_TEXTURE_2D, texture1);
glBindTexture(GL_TEXTURE_2D, texture2);
glActiveTexture(GL_TEXTURE0);
glActiveTexture(GL_TEXTURE1); 

之后texture2绑定到当前纹理单元(GL_TEXTURE0默认情况下),当前纹理单元为GL_TEXTURE1. 注意texture1
只是被绑定了一小会儿,但是绑定丢失了,什么时候texture2绑定了。

相比之下,当你这样做时

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, texture2);

当前纹理单元显式设置为GL_TEXTURE0texture1绑定到纹理纹理单元 0。之后,当前纹理单元切换到GL_TEXTURE1texture2绑定到纹理单元 1(因为此时它是当前的)。


请注意,使用直接状态访问glBindTextureUnit(从 OpenGL 4.5 开始)可以将纹理直接绑定到纹理单元。例如:

glBindTextureUnit(GL_TEXTURE0, texture1);
glBindTextureUnit(GL_TEXTURE1, texture2);

推荐阅读