[SOLVED] [GLSL] help with sampler2D

Started by
5 comments, last by Valeranth 15 years, 5 months ago
Hi, I am currently working on a shader for a multi-textured RTT. Currently, however, the first sampler2D comes out a greenish color while the second is clear. Any ideas? vertex shader

varying vec2 TexCoord;

void main(){
        //gl_TexCoord[0] = gl_MultiTexCoord0; //NOTE:uncommening does nothing
        TexCoord = gl_MultiTexCoord0.st;
        gl_Position = ftransform();
}



fragment shader

uniform sampler2D tex0;
uniform sampler2D tex1;

varying vec2 TexCoord;

void main(){
        vec4 textel0 = texture2D( tex0, TexCoord );
        vec4 textel1 = texture2D( tex1, TexCoord );
        vec3 temp = mix( textel0.rgb, textel1.rgb, textel1.a );
        gl_FragColor = vec4(temp, textel0.a );
}



bound with

void glslSetValue1i( GLuint program, GLchar *name, GLint value ){
        GLint location;
        location = glGetUniformLocation( program, name );
        if( location == -1 ){
                printf("Error:: GLSL >> Error setting %s to %i\n", name, value );
                return;
        }

        glUniform1i( location, value );
}

....
glslSetValue1i( pro, "tex0", 0 );
glslSetValue1i( pro, "tex1", 1 );



edit: the draw code lol

//enable texture0, base
        glActiveTexture(GL_TEXTURE0);
        glBindTexture( GL_TEXTURE_2D, base->GetID());

        //enable texture1, object
        glActiveTexture(GL_TEXTURE1);
        glBindTexture( GL_TEXTURE_2D, object->GetID());

        // set the texture as render target
        glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT);

        //insure that everythign is being rendered by the shader
        glPolygonMode(GL_FRONT,GL_FILL);
        glLoadIdentity();

        //set up the viewport 
        glViewport( 0, 0, base->GetWidth(), base->GetHeight() );

        glTranslatef( 0.0, 0.0, -1.0 );

        glBegin(GL_QUADS);
                //glTexCoord2f(0.0, 0.0); 
                glVertex3f( -1.0, 1.0, 0.0 );

                //glTexCoord2f( 1.0, 0.0 );
                glVertex3f( 1.0, 1.0, 0.0 );

                //glTexCoord2f( 1.0, 1.0 );
                glVertex3f( 1.0, -1.0, 0.0 );

                //glTexCoord2f( 0.0, 1.0 );
                glVertex3f( -1.0, -1.0, 0.0 );
        glEnd();

        //unbind the texture occupying the second texture unit
        glActiveTexture( GL_TEXTURE1 );
        glBindTexture( GL_TEXTURE_2D, 0 );

        //unbind the texture occupying the first texture unit
        glActiveTexture( GL_TEXTURE0 );
        glBindTexture( GL_TEXTURE_2D, 0 );

        glDrawBuffer(0);
        //render back to the standard buffer
        glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );


[Edited by - Valeranth on November 8, 2008 6:11:05 PM]
Advertisement
At first glance your code all makes sense..

You say one texture comes out green and the other clear...
I don't follow you as you are mixing the two in your shaders.. This may be exactly what should happen when you factor in the .a blending and the actual content of the two textures...

Things to be aware of.. Are you doing any lighting?
Are you setting up the Texture coordinates as you need them in your main C++ code? Because you are using the fixed pipeline Texture coord stuff to load TexCoord in your shaders.

Feel free to 'rate me down', especially when I prove you wrong, because it will make you feel better for a second....
Quote:Original post by scratt
Things to be aware of.. Are you doing any lighting?
Are you setting up the Texture coordinates as you need them in your main C++ code? Because you are using the fixed pipeline Texture coord stuff to load TexCoord in your shaders.


First when I do gl_FragColor = texel0; it just shows green, with texel1 is clear..
No lighting, and the other things I dont know what you mean.
http://www.opengl.org/wiki/index.php/Debugging_Tools
Sig: http://glhlib.sourceforge.net
an open source GLU replacement library. Much more modern than GLU.
float matrix[16], inverse_matrix[16];
glhLoadIdentityf2(matrix);
glhTranslatef2(matrix, 0.0, 0.0, 5.0);
glhRotateAboutXf2(matrix, angleInRadians);
glhScalef2(matrix, 1.0, 1.0, -1.0);
glhQuickInvertMatrixf2(matrix, inverse_matrix);
glUniformMatrix4fv(uniformLocation1, 1, FALSE, matrix);
glUniformMatrix4fv(uniformLocation2, 1, FALSE, inverse_matrix);
Quote:Original post by V-man
http://www.opengl.org/wiki/index.php/Debugging_Tools


Sadly, I havnt found a debugger that runs in Linux.. :/

You have commented glTexCoord2f calls, any reason why ?

Also check if you have texturing enabled, have proper filtering set (and/or mipmaps generated) etc.
fixed it, I had commented the glTexCoord becouse I didnt think I needed them, the error was in the drawing code (as has been pointed out here)

[drawing]
 glBegin(GL_QUADS);                glMultiTexCoord2f( GL_TEXTURE0, 0.0, 0.0 );                glMultiTexCoord2f( GL_TEXTURE1, 0.0 + xOffset, 0.0 + yOffset );                glVertex3f( -1.0, -1.0, 0.0 );                glMultiTexCoord2f( GL_TEXTURE0, 1.0, 0.0 );                glMultiTexCoord2f( GL_TEXTURE1, 1.0 + xOffset, 0.0 + yOffset );                glVertex3f( 1.0, -1.0, 0.0 );                glMultiTexCoord2f( GL_TEXTURE0, 1.0, 1.0 );                glMultiTexCoord2f( GL_TEXTURE1, 1.0 + xOffset, 1.0 + yOffset );                glVertex3f( 1.0, 1.0, 0.0 );                glMultiTexCoord2f( GL_TEXTURE0, 0.0, 1.0 );                glMultiTexCoord2f( GL_TEXTURE1, 0.0 + xOffset, 1.0 + yOffset );                glVertex3f( -1.0, 1.0, 0.0 );        glEnd();


and the shaders (not much change )

[vertex]void main(){        gl_TexCoord[0] = gl_MultiTexCoord0;        gl_TexCoord[1] = gl_MultiTexCoord1;        gl_Position = ftransform();}[fragement]uniform sampler2D tex0;uniform sampler2D tex1;void main(){        vec4 textel0 =  texture2D( tex0, gl_TexCoord[0].st );        vec4 textel1 = texture2D( tex1, gl_TexCoord[1].st );        vec3 temp = mix( textel0.rgb, textel1.rgb, textel1.a );        gl_FragData[0] =  vec4( temp, textel0.a );}


THANKS FOR THE HELP!! ^__^

This topic is closed to new replies.

Advertisement