Opengl 只能使用glActiveTexture(GL_TEXTURE0)而不能使用其他纹理单元?
我对OpenGL中的纹理和立方体贴图感到困惑 假设我想要基本的纹理贴图。我有: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进行环境映射。我想,也作为参考,我应该这样
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)代码>,它可以工作。@超常您不是新用户。您现在知道,评论部分不打算问其他问题。你知道你有。无论如何,您在问题中没有提供足够的信息来发现新问题。