Jump to content
  • Advertisement
Sign in to follow this  
Asem

OpenGL multi-texturing problem

This topic is 3329 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm trying to load these textures into the shader which seems okay as in the shader code I can effect either sampler2D like tex1+tex2 will work but for some reason tex2 doesn't seem to be loading the texture I assigned for texture unit 1 but rather texture unit 0. I found that for some reason tex1 is loaded into texture unit 0 and 1 although I bind a different texture for each texture unit [ useTexture function calls glBindTexture] I'm using the immediate mode to draw the vertices and texcoords and I do use glMultiTexCoord2f 2 time one for GL_TEXTURE0 and the other for GL_TEXTURE1. glMultiTexCoord2f( GL_TEXTURE0, ...); glMultiTexCoord2f( GL_TEXTURE1, ...); ///vertices... I have no clue why when I set the active texture to GL_TEXTURE1 and set the 2nd texture it seems to really set the first. I have checked the # of texture units, and made sure the texIds were different. I even went as far as making sure which texture unit was active and so I'm stumped. On the side when I look up the texture unit with glGetIntegerv is the value supposed to return something like 33394 for GL_TEXTURE0 and 33395 for GL_TEXTURE1 (those numbers are not exact but as I see it increased by one I would think that's just opengl's internal thinking). Basically, the 1st texture seems to be bounded in both texUnit 0 and 1 but it doesn't make sense as I binded a different tex in texUnit 1.

int main(...)
{
    ///GLUT INIT...

    ///Load Texture
    BilbyTex = new texBlock;
    BilbyTex->storeImageSingle("./Bilby_Diffuse_512.jpg");
    BilbyTex->useTexture();

    HorseTex = new texBlock;
    HorseTex->storeImageSingle("./test.jpg");
    HorseTex->useTexture();

    glActiveTexture(GL_TEXTURE0);
        BilbyTex->useTexture();
    glActiveTexture(GL_TEXTURE1);
        HorseTex->useTexture(); ///doesn't seem to want to use it but uses the above instead

    ///END

    ///Load Shader
    pointLightShader = new Shader("./Shaders/pLight.vert", "./Shaders/pLight.frag");

    int uLoc=0;
    uLoc = glGetUniformLocation( pointLightShader->getProgramHandler(), "texture" );
    glUniform1i(uLoc, 0);

    uLoc = glGetUniformLocation( pointLightShader->getProgramHandler(), "texture_2" );
    glUniform1i(uLoc, 1);

    uLoc = glGetUniformLocation( pointLightShader->getProgramHandler(), "camera_position" );
    glUniform3fv(uLoc, 3, camera_pos);

    pointLightShader->shaderLog(); ///Shows Log in Console Window

    ///END




Shader(glsl):

///Vertex:

varying vec3 position;
varying vec3 normal;
varying vec2 texC;
varying vec2 texC_2;

void main()
{	
	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
	
	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; ///
	gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1; ///
	normal = gl_NormalMatrix * gl_Normal;
	position = gl_Vertex.xyz;

	texC = gl_TexCoord[0].st; ///
	texC_2 = gl_TexCoord[1].st; ///

}

///Fragement

uniform sampler2D texture;
uniform sampler2D texture_2;
uniform vec3 camera_position;
varying vec3 position;
varying vec3 normal;
varying vec2 texC;
varying vec2 texC_2;


void main()
{

	int xL=0; 

        ///Other Stuff...

	vec4 texColor = texture2D(texture, texC);
	vec4 texColor2 = texture2D(texture_2, texC_2);

	texColor.r += 1.0;
	texColor2.g += 1.0;

	vec4 cTColor = texColor * texColor2;

	//Note: Can't use var from varying or uniform for indexs apparently. At
	//Least it seems for any of the special gl_xxxx calls
	gl_FragColor = gl_LightSource[xL].ambient+
		      (diffuse * vec4(cTColor.rgb, 1.0)) +
		      (specular);
}


[Edited by - Asem on June 8, 2009 6:35:29 PM]

Share this post


Link to post
Share on other sites
Advertisement
Why do you have a 3 in here
glUniform3fv(uLoc, 3, camera_pos);

it should be 1

Share this post


Link to post
Share on other sites
I give it an array ( camera_pos[3] ) so according to the opengl doc it's glUniformfv(location, size, float * value).

I did the multi texturing with the FFP and it works.

The problem is for some reason the 2nd sampler ,texture_2, doesn't seem to want to grab the correct texture from GL_TEXTURE1 even though you can see that I set it. In the end it just grabs the texture for GL_TEXTURE0. I know its not the texcoords as I did an example and scroll 1 texture but not the other and it worked.

I can't figure out what I'm missing or doing wrong or somethings just weird. I know when I mess up in my glsl code just a little it wants to work but then I can't modify the 2 texture like multiplying them and such.


SOLVED:
I didn't have the shader program active before calling gluniform*.

m_shader->useShader();
//Then call...
gluniform* ...

[Edited by - Asem on June 10, 2009 4:31:56 PM]

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!