C++ 在openGL中多次绑定缓冲区
,一点困惑是是否有必要绑定VAO之类的缓冲区 或者纹理ID多次不解除绑定 关于上面的链接和,我遇到了两个彼此有点不同的场景 首先,作者创建一个VAO(在主绘图循环之外)并使用C++ 在openGL中多次绑定缓冲区,c++,opengl,C++,Opengl,,一点困惑是是否有必要绑定VAO之类的缓冲区 或者纹理ID多次不解除绑定 关于上面的链接和,我遇到了两个彼此有点不同的场景 首先,作者创建一个VAO(在主绘图循环之外)并使用glBindVertexArray(VAO)绑定VAO,然后他不使用glBindVertexArray(0)解除绑定,但他在maindraw循环中再次绑定它。我的困惑,这真的有必要吗?当前绑定的VAO不是已经。。。跳跃既然它已经是活动VAO,为什么还要绑定它? 以及 第二个,作者使用以下方法创建纹理ID: glGenText
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
。@juztcodeGL_TEXTURE0
的值为0x0x84C0
(33985)。的参数必须是枚举数常量,与它必须是索引的位置相比。您的意思是,当openGL启动时,没有着色器,只有纹理?而“GL_TEXTURE0在命名纹理单元0的位置表示“否”。您的意思是GL_TEXTURE0表示纹理单元0的地址?