C++ 在openGL中多次绑定缓冲区

C++ 在openGL中多次绑定缓冲区,c++,opengl,C++,Opengl,,一点困惑是是否有必要绑定VAO之类的缓冲区 或者纹理ID多次不解除绑定 关于上面的链接和,我遇到了两个彼此有点不同的场景 首先,作者创建一个VAO(在主绘图循环之外)并使用glBindVertexArray(VAO)绑定VAO,然后他不使用glBindVertexArray(0)解除绑定,但他在maindraw循环中再次绑定它。我的困惑,这真的有必要吗?当前绑定的VAO不是已经。。。跳跃既然它已经是活动VAO,为什么还要绑定它? 以及 第二个,作者使用以下方法创建纹理ID: glGenText

,一点困惑是是否有必要绑定VAO之类的缓冲区 或者纹理ID多次不解除绑定

关于上面的链接和,我遇到了两个彼此有点不同的场景

首先,作者创建一个VAO(在主绘图循环之外)并使用
glBindVertexArray(VAO)
绑定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);
有两件事我不明白他在做什么:

  • 为什么他在主循环中再次绑定纹理ID 在主循环之外完成?(这个类似于VAO,但我 还不知道这里是否可以解绑)
  • 他为什么选择活动纹理单元(使用
    glActiveTexture
    ) 圈内?不能在主拉环外完成吗
  • 将纹理绑定到指定的目标和当前纹理单元。当前纹理单位由设置。当前纹理单元是全局状态,
    glBindTexture
    考虑该状态

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

    glBindTexture(GL_TEXTURE_2D,texture1);
    glBindTexture(GL_TEXTURE_2D,texture2);
    玻璃纹理(GL_纹理0);
    玻璃结构(GL_纹理1);
    
    之后,
    texture2
    被绑定到当前纹理单元(
    GL\u TEXTURE0
    ),当前纹理单元是
    GL\u TEXTURE1
    。注意
    texture1

    只绑定了一小会儿,但绑定
    texture2
    时绑定丢失

    相比之下,当你

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D,texture1);
    玻璃结构(GL_纹理1);
    glBindTexture(GL_TEXTURE_2D,texture2);
    
    当前纹理单元显式设置为
    GL_TEXTURE0
    texture1
    绑定到纹理单元0。之后,当前纹理单元切换到
    GL_TEXTURE1
    ,并且
    texture2
    绑定到纹理单元1(因为此时它是当前的)


    注意,使用and(自OpenGL 4.5以来),纹理可以直接绑定到纹理单元。e、 g:

    glBindTextureUnit(GL_TEXTURE0,texture1);
    glBindTextureUnit(GL_TEXTURE1,texture2);
    
    “但他在主绘图循环中再次绑定了它。我的困惑是,这真的有必要吗?”没有。但是,如果作者要扩展代码并使用1个以上的VAO,则有必要。创建纹理单元1时,
    texture2
    未绑定到纹理单元1(第一次绑定)。这件事以后再做。当然,以前也可以这样做。同样,如果作者要扩展他的程序并想绘制不同的对象和不同的纹理,那么在绘制对象之前必须绑定它们。@rabbi76,这意味着此时代码是多余的,
    glActiveTexture
    也可以在循环之外完成?您所说的:
    texture2在创建时未绑定到纹理单元1(第一次绑定)是什么意思。这将在以后完成。
    ?在
    glGenTextures(1,&texture2)
    glBindTexture(GL_TEXTURE_2D,texture2)当前纹理单元为0,因此
    texture2
    绑定到纹理单元0。将纹理绑定到指定目标和当前纹理单元中。如果在彼此后面绑定两个纹理(2次调用
    glBindTexture
    ),而不在两者之间切换纹理单元(
    glActiveTexture
    ),则仅绑定第二个纹理为完整性,OpenGL4.5(以及之前的扩展)允许您使用
    glBindTextureUnit直接将纹理绑定到纹理单元(GL_TEXTURE0,texture1)
    。有关详细信息,请参阅。此外,如果要将纹理绑定到单个纹理单元,可以在ARB_DSA之前使用
    glBindTextures
    。@juztcode
    GL_TEXTURE0
    的值为
    0x0x84C0
    (33985)。的参数必须是枚举数常量,与它必须是索引的位置相比。您的意思是,当openGL启动时,没有着色器,只有纹理?而“GL_TEXTURE0在命名纹理单元0的位置表示“否”。您的意思是GL_TEXTURE0表示纹理单元0的地址?