Opengl 更改片段着色器中显示的纹理
我正在尝试将2个纹理传递给着色器,我对这里的工作有点困惑 这是opengl代码Opengl 更改片段着色器中显示的纹理,opengl,glsl,texture-mapping,multitexturing,Opengl,Glsl,Texture Mapping,Multitexturing,我正在尝试将2个纹理传递给着色器,我对这里的工作有点困惑 这是opengl代码 GLuint textures; GLuint textures1;</code> glGenTextures(1,&textures); glGenTextures(1,&textures1); glBindTexture(GL_TEXTURE_2D,textures); glTexImage2D(GL_TEXTURE_2D,0,GL_RG
GLuint textures;
GLuint textures1;</code>
glGenTextures(1,&textures);
glGenTextures(1,&textures1);
glBindTexture(GL_TEXTURE_2D,textures);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,texImg);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glBindTexture(GL_TEXTURE_2D,textures1);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,texImg1);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glBindTexture(GL_TEXTURE_2D,textures1);
GLuint location1=glGetUniformLocation(programObjectFloor,"Tex1");
GLuint location2=glGetUniformLocation(programObjectFloor,"Tex2");
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D,textures1);
glUniform1i(location2, 1);
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,textures);
glUniform1i(location1, 0);
顶点着色器是
attribute vec4 position;
attribute vec4 texture;
uniform mat4 MVP;
varying vec4 ptexture;
void main()
{
ptexture = texture;
gl_Position = MVP * position;
}
varying vec4 ptexture;
uniform sampler2D Tex1;
uniform sampler2D Tex2;
uniform bool swit;
void main()
{
gl_FragColor = texture2D(Tex1,ptexture.st);
}
片段着色器是
attribute vec4 position;
attribute vec4 texture;
uniform mat4 MVP;
varying vec4 ptexture;
void main()
{
ptexture = texture;
gl_Position = MVP * position;
}
varying vec4 ptexture;
uniform sampler2D Tex1;
uniform sampler2D Tex2;
uniform bool swit;
void main()
{
gl_FragColor = texture2D(Tex1,ptexture.st);
}
当我换线的时候
gl_FragColor = texture2D(Tex2,ptexture.st);
仍然只显示第一个纹理,但当我注释掉下面几行时,会显示第二个纹理,你能解释一下为什么会发生这种情况吗
// glActiveTexture(GL_TEXTURE0);
// glEnable(GL_TEXTURE_2D);
// glBindTexture(GL_TEXTURE_2D,textures);
// glUniform1i(location1, 0);
在查询统一位置并将值分配给它们之前,必须调用
glUseProgram
。最有可能的情况是,您稍后会切换程序,将这些制服设置为的任何内容都保留在未定义状态
此外,在使用着色器时,不需要glEnable(GL_纹理_2D)代码>,是否使用纹理由着色器的代码决定
与您的问题无关,只是指出,在查询统一位置之前,您有一个对glBindTexture
的冗余调用。您对glUseProgram的调用在哪里?您的版本
指令在哪里?