Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 7 of 7

Thread: passing two textures to GLSL

  1. #1
    Junior Member Newbie
    Join Date
    Apr 2009
    Posts
    12

    passing two textures to GLSL

    Hi!
    First of all, I want you to know that I have searched the forum and founh solutions to similar problems, but somehow I couldn't manage to make my program work.

    I am trying to pass 2 textures to GLSL from C++, and there just add their color and display. I really cannot see what I'm doing wrong, so please help

    Here is the code:
    Code :
    glGenTextures(1,&texName1);
    	glBindTexture(GL_TEXTURE_2D,texName1);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    	glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,sizeX,sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,fileData1);
    	glBindTexture(GL_TEXTURE_2D,0);
     
    	glGenTextures(1,&texName2);
    	glBindTexture(GL_TEXTURE_2D,texName2);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    	glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,sizeX2,sizeY2,0,GL_RGB,GL_UNSIGNED_BYTE,fileData2);
    	glBindTexture(GL_TEXTURE_2D,0);
    set shaders function
    Code :
     void setShaders() {
     
    	char *vs = NULL,*fs = NULL;
    	GLint location1,location2;
     
    	v = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
    	f = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
     
     
    	vs = textFileRead("texture.vert");
    	fs = textFileRead("texture.frag");
     
    	const char * ff = fs;
    	const char * vv = vs;
     
    	glShaderSourceARB(v, 1, &vv,NULL);
    	glShaderSourceARB(f, 1, &ff,NULL);
     
    	free(vs);free(fs);
     
    	glCompileShaderARB(v);
    	glCompileShaderARB(f);
     
    	p = glCreateProgramObjectARB();
    	glAttachObjectARB(p,f);
    	glAttachObjectARB(p,v);
     
    	glLinkProgramARB(p);
     
    	location1=glGetUniformLocationARB(p,"texture1");
    	location2=glGetUniformLocationARB(p,"texture2");
     
    	glActiveTextureARB(GL_TEXTURE0);
    	glBindTexture(GL_TEXTURE_2D, texName1);
    	glEnable(GL_TEXTURE_2D);
    	glUniform1iARB(location1, 0);
     
    	glActiveTextureARB(GL_TEXTURE1);
    	glBindTexture(GL_TEXTURE_2D, texName2);
    	glEnable(GL_TEXTURE_2D);
    	glUniform1iARB(location2, 1);
     
    	glUseProgramObjectARB(p);
    }
    vertex shader:
    Code :
     varying vec3 normal;
    void main()
    {
    	normal = gl_NormalMatrix * gl_Normal ;
    	gl_Position = ftransform();
     
    	gl_TexCoord[0] = gl_MultiTexCoord0;
    	gl_TexCoord[1] = gl_MultiTexCoord1;
    }
    fragment shader:
    Code :
    varying vec3 normal;
    uniform sampler2D texture1;
    uniform sampler2D texture2;
     
    void main()
    {
    	gl_FragColor = texture2D(texture1,gl_TexCoord[0])+texture2D(texture2,gl_TexCoord[1]);
    }

    this program displays just the data found under the fileData1 texture, and the fileData2 texture is just black. If I swap the two textures in the glTexImage2D functions, it will display only the second texture, so it's not a problem related with reading texture data...

  2. #2
    Junior Member Newbie
    Join Date
    Apr 2009
    Posts
    12

    Re: passing two textures to GLSL

    I have managed to half - solve the problem: the code
    Code :
    location1=glGetUniformLocationARB(p,"texture1");
    	location2=glGetUniformLocationARB(p,"texture2");
     
    	glActiveTextureARB(GL_TEXTURE0);
    	glBindTexture(GL_TEXTURE_2D, texName1);
    	glEnable(GL_TEXTURE_2D);
    	glUniform1iARB(location1, 0);
     
    	glActiveTextureARB(GL_TEXTURE1);
    	glBindTexture(GL_TEXTURE_2D, texName2);
    	glEnable(GL_TEXTURE_2D);
    	glUniform1iARB(location2, 1);
    has to be after glUseProgram

    But now the second half-problem:

    The program works only if I have
    Code :
    gl_FragColor = texture2D(texture1,gl_TexCoord[0])+texture2D(texture2,gl_TexCoord[0]);
    }

    So, on both texture lookups I have to have the same gl_TexCoord[0] variable. If I put gl_TexCoord[1] on the second texture it doesn't work. Can anyone say why?

  3. #3
    Senior Member OpenGL Pro dletozeun's Avatar
    Join Date
    Jan 2006
    Location
    FRANCE
    Posts
    1,370

    Re: passing two textures to GLSL

    Strange, your first problem remind me something but I can't find out. AFAIK, you should not have to put the program in use to get uniforms location...

    How do you set textures coordinates in you draw function?

  4. #4
    Junior Member Regular Contributor
    Join Date
    Apr 2001
    Posts
    181

    Re: passing two textures to GLSL

    How do you pass the second texture coordinates? Have you tried using something else, just to make sure it's the texture reading that's going wrong? Ie use object space coordinates as texture coords?

  5. #5
    Junior Member Newbie
    Join Date
    Apr 2009
    Posts
    12

    Re: passing two textures to GLSL

    thanks for your replies

    my draw function is:
    Code :
    void renderScene(void) {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glBegin( GL_QUADS );
    		glTexCoord2d(0.0,0.0); glVertex2f(-2.0,2.0);
    		glTexCoord2d(1.0,0.0); glVertex2f(2.0,2.0);
    		glTexCoord2d(1.0,1.0); glVertex2f(2.0,-2.0);
    		glTexCoord2d(0.0,1.0); glVertex2f(-2.0,-2.0);
    	glEnd();
    	glutSwapBuffers();
    }

  6. #6
    Junior Member Regular Contributor
    Join Date
    Apr 2001
    Posts
    181

    Re: passing two textures to GLSL

    Well you're not assigning anything to the second texture coordinates (which you use in the vertex shader through gl_MultiTexCoord1). You'll need to use glMultiTexCoord2d() instead. It works exactly like glTexCoord except it takes a texture "name" to specify which set to use. So for instance "glMultiTexCoord2d(GL_TEXTURE0, 0.0,0.0);" You'll need to pass something for GL_TEXTURE1 as well.

    See section 2.7 "Vertex Specification" in the specifications for more details.

  7. #7
    Junior Member Newbie
    Join Date
    Apr 2009
    Posts
    12

    Re: passing two textures to GLSL

    Tnx, that solved my problem

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •