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);
Share:
13,365
user1075940
Author by

user1075940

Updated on June 15, 2022

Comments

  • user1075940
    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.