Opengl 只能使用glActiveTexture(GL_TEXTURE0)而不能使用其他纹理单元?

Opengl 只能使用glActiveTexture(GL_TEXTURE0)而不能使用其他纹理单元?,opengl,texture-mapping,Opengl,Texture Mapping,我对OpenGL中的纹理和立方体贴图感到困惑 假设我想要基本的纹理贴图。我有: GLuint纹理0; glGenTextures(1和0); 玻璃纹理(GL_纹理0); glBindTexture(GL_TEXTURE_2D,texture0); 然后我设置了glTexImage2D并调用glUniform1i(glGetUniformLocation(着色器程序,“纹理采样器”),GL\u TEXTURE0),一切正常 现在,我还想使用cubemap进行环境映射。我想,也作为参考,我应该这样

我对OpenGL中的纹理和立方体贴图感到困惑

假设我想要基本的纹理贴图。我有:

GLuint纹理0;
glGenTextures(1和0);
玻璃纹理(GL_纹理0);
glBindTexture(GL_TEXTURE_2D,texture0);
然后我设置了
glTexImage2D
并调用
glUniform1i(glGetUniformLocation(着色器程序,“纹理采样器”),GL\u TEXTURE0)
,一切正常

现在,我还想使用cubemap进行环境映射。我想,也作为参考,我应该这样做:

GLuint纹理1;
glGenTextures(1和1);
玻璃纹理(GL_纹理0+1);
glBindTexture(GL_纹理_立方体_贴图,纹理1);
然后
glUniform1i(glGetUniformLocation(着色器程序,“立方体贴图采样器”),GL\u TEXTURE0+1)

但是,这不起作用,仅渲染黑色对象。 另一方面,如果我不运行
glActiveTexture(GL\u TEXTURE0+1)
,而是坚持运行
GL\u TEXTURE0
,一切都很好

根据我的理解,这不是应该的

有人能解释一下发生了什么事吗

我正在使用GLSL
#version 440

glUniform1i(glGetUniformLocation(着色器程序,“纹理采样器”),GL\u TEXTURE0+1)
是一个奇怪的想法

纹理单元是纹理对象和纹理采样器之间的整体绑定点。
GL_TEXTURE0
是用于的枚举数常量<代码>GL_纹理0寻址纹理单元0。
需要在纹理采样器上设置的值是纹理单位,而不是纹理单位的“名称”。因此,您必须设置0,而不是
GL\u TEXTURE0

glUniform1i(glGetUniformLocation(着色器程序,“纹理采样器”),GL\u TEXTURE0+1)

glUniform1i(glGetUniformLocation(着色器程序,“纹理采样器”),1)
请注意,默认情况下,采样器绑定点为0。指令
glUniform1i(…,GL\u TEXTURE0+1)
会导致
无效值
错误,并且根本不会更改绑定点。

如果使用
Uniform1i{v}
设置 取样器均匀至小于零或大于或等于该值的值 最大组合纹理图像单位


glUniform1i
的参数不应该是从
GL_TEXTURE0
的偏移量吗?所以
glUniform1i(glGetUniformLocation(着色器程序,“立方体贴图采样器”),1)
。看,谢谢。然而,也
glActiveTexture(GL_TEXTURE0+1);glUniform1i(环境采样器位置,1)渲染黑色对象。但如果我将其更改为
glActiveTexture(GL_TEXTURE0);glUniform1i(环境采样器位置,0),它可以工作。@超常您不是新用户。您现在知道,评论部分不打算问其他问题。你知道你有。无论如何,您在问题中没有提供足够的信息来发现新问题。