提问者:小点点

OpenGL-GLBindTexture是否覆盖活动纹理单元的内容


我正在寻找GLActiveTexture(。。。)GLBindTexture(。。。)之间的关系,我在这里找到了一个很棒的答案,最上面的答案(作者/用户Alfonse)给出了两个函数如何工作的伪代码,我理解了其中的大部分内容。 但是,他在书中提到了这样的呼吁:

glActiveTexture(GL_TEXTURE0 + 5);
glBindTexture(GL_TEXTURE_2D, object);
glTexImage2D(GL_TEXTURE_2D, ...);  

但是人们经常将纹理绑定到上下文中,只是为了上传一些数据或者修改它。 在这一点上,你将它绑定到哪个纹理单元并不重要,因此没有必要设置当前的纹理单元。 glTexImage2D不关心当前活动纹理是0,1,40还是什么。

所以我的问题是:当生成两个纹理时,我们要做这样的事情:

 glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

 glGenTextures(1, &texture2);
glBindTexture(GL_TEXTURE_2D, texture2);
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);    


//some more code
//inside the render loop
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture2);

glDrawElements(...); glSwapBuffers();
//end of render loop

注意,在render循环之前的代码中,我使用了两个纹理GLBindTexture(。。。),而没有调用GLActiveTexture(。。。)。 因为,默认的活动纹理单元是:gl_texture0,这是否意味着为texture1设置的参数被texture2覆盖?


共1个答案

匿名用户

不,纹理参数(由gltexParameter设置)是为特定纹理(当前绑定到活动纹理单元的纹理)设置的,而不是为纹理单元(即,不是为gl_texturei之一)设置的。

请注意,您对GLTExtureParameterI的使用不正确。 而不是gl_texture_2d,它需要一个纹理句柄,如glgentextures1返回的那样。 您将其与GLTexParameterI混淆了,后者确实可以用GL_Texture_2D调用。

1正如@Derhass所指出的,GLGENTextures(与GLCreateTextures)仅保留句柄。 只有当您将具有此句柄的纹理传递给GLBindTexture时,才会创建它。 如果您使用GLTexParameter并不重要,但是如果您想使用GLTextureParameterI和其他直接操作纹理句柄的函数,这可能很重要。