Opengl 将纹理传递到着色器
我一直在试图弄清楚如何将纹理发送到着色器,但我搞不清楚。我的代码看起来不错,但我的第二个纹理是黑色的Opengl 将纹理传递到着色器,opengl,glsl,Opengl,Glsl,我一直在试图弄清楚如何将纹理发送到着色器,但我搞不清楚。我的代码看起来不错,但我的第二个纹理是黑色的 void setShaders() { glEnable (GL_TEXTURE_2D); v2 = glCreateShader(GL_VERTEX_SHADER); f2 = glCreateShader(GL_FRAGMENT_SHADER); load_shader(v2,"a.vert"); load_shader(f2,"a.fr
void setShaders() {
glEnable (GL_TEXTURE_2D);
v2 = glCreateShader(GL_VERTEX_SHADER);
f2 = glCreateShader(GL_FRAGMENT_SHADER);
load_shader(v2,"a.vert");
load_shader(f2,"a.frag");
glCompileShader(v2);
glCompileShader(f2);
p = glCreateProgram();
glAttachShader(p,v2);
glAttachShader(p,f2);
GLubyte* textura=LoadImageToTexture("d.jpg");
GLubyte* textura2=LoadImageToTexture("n.jpg");
GLuint texturaID[2];
glGenTextures(2, texturaID);
glBindTexture(GL_TEXTURE_2D, texturaID[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA, w, h, 0, GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)textura );
glBindTexture(GL_TEXTURE_2D, texturaID[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,1,GL_RGBA, w, h, 0, GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)textura2 );
glLinkProgram(p);
glUseProgram(p);
GLint baseImageLoc = glGetUniformLocation(p, "tex");
GLint normImage = glGetUniformLocation(p, "norm");
glUniform1i(baseImageLoc, 0);
glUniform1i(normImage, 1);
glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, texturaID[0]);
glActiveTexture(GL_TEXTURE0 + 1);
glBindTexture(GL_TEXTURE_2D, texturaID[1]);
}
着色器
[顶点]
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
uniform sampler2D tex;
uniform sampler2D norm;
[fragment]
void main()
{
vec4 color = texture2D(tex,gl_TexCoord[0].st);
vec4 color2 = texture2D(norm,gl_TexCoord[0].st);
gl_FragColor = color*color2;
}
编辑魔鬼来了
glTexImage2D(GL_TEXTURE_2D,**1**,GL_RGBA, w, h, 0, GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)textura2 );
而不是1它应该是0。您的第二个纹理似乎是以错误的方式创建的:
glTexImage2D(GL_TEXTURE_2D,1,...);
应该是
glTexImage2D(GL_TEXTURE_2D,0,...);
至于你的第二个问题,即使我不确定是否正确;注释行时,实际上将统一值保留为其默认值,即0。因此,净效应与
glUniform1i(baseImageLoc, 0);
你的GLSL
#版本
指令在哪里?那么重要吗?我添加了#版本120,但仍然一无所获