Passing textures to shader
13,365
Your second texture seems to be created in a wrong way :
glTexImage2D(GL_TEXTURE_2D,1,...);
should be
glTexImage2D(GL_TEXTURE_2D,0,...);
As for your second question, even if I'm not sure to get it right ; when you comment the lines, you actually leave the uniform value to its default value, which is 0. The net effect is thus the same as
glUniform1i(baseImageLoc, 0);
Author by
user1075940
Updated on June 15, 2022Comments
-
user1075940 almost 2 years
I've been trying to figure out how to send a texture to a shader but I can't figure it out. My code looks fine to me but my second texture is black.
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]); }
Shaders [vertex]
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; }
EDIT here is the devil!!!
glTexImage2D(GL_TEXTURE_2D,**1**,GL_RGBA, w, h, 0, GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)textura2 );
Instead of 1 it should be 0.