gpt4 book ai didi

c++ - 在openGL中多次绑定(bind)缓冲区

转载 作者:行者123 更新时间:2023-12-02 10:06:03 25 4
gpt4 key购买 nike

While learning opengl ,有点困惑是是否需要绑定(bind)像VAO这样的缓冲区
或纹理 ID 多次而不解除绑定(bind)?

引用上面的链接和full source code ,我遇到了两个彼此不同的场景。

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

和,

第二 ,作者使用以下方法创建纹理 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);

我不明白他所做的两件事是:
  • 为什么他在主循环中再次绑定(bind)纹理ID
    在主循环之外完成了吗?(这个类似于 VAO,但我
    还不知道这里是否可以解除绑定(bind))
  • 他为什么选择事件纹理单元(使用 glActiveTexture )
    在循环内?不能在主绘制循环之外完成吗?
  • 最佳答案

    glBindTexture 将纹理绑定(bind)到指定目标和当前纹理单元。当前纹理单元由 glActiveTexture 设置.当前纹理单元是全局状态,glBindTexture认为该状态。

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

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

    之后 texture2绑定(bind)到当前纹理单元(默认为 GL_TEXTURE0),当前纹理单元为 GL_TEXTURE1 .备注 texture1只是绑定(bind)了一小会儿,但是绑定(bind)丢失了,当 texture2是绑定(bind)的。

    相比之下,当你这样做时

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

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

    注意,使用 Direct State Access glBindTextureUnit (从 OpenGL 4.5 开始)纹理可以直接绑定(bind)到纹理单元。例如。:

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

    关于c++ - 在openGL中多次绑定(bind)缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60221462/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com