我正在寻找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
覆盖?
不,纹理参数(由gltexParameter
设置)是为特定纹理(当前绑定到活动纹理单元的纹理)设置的,而不是为纹理单元(即,不是为gl_texturei
之一)设置的。
请注意,您对GLTExtureParameterI
的使用不正确。 而不是gl_texture_2d
,它需要一个纹理句柄,如glgentextures
1返回的那样。 您将其与GLTexParameterI
混淆了,后者确实可以用GL_Texture_2D
调用。
1正如@Derhass所指出的,GLGENTextures
(与GLCreateTextures
)仅保留句柄。 只有当您将具有此句柄的纹理传递给GLBindTexture
时,才会创建它。 如果您使用GLTexParameter
并不重要,但是如果您想使用GLTextureParameterI
和其他直接操作纹理句柄的函数,这可能很重要。