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.
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With