TexGen not working with GLSL, with fixed pipeline is ok

Started by
2 comments, last by nitm 17 years, 8 months ago
Hello, I'm trying to implement a flat plane reflection and the code is working except one minor problem: I can't project the texture on to the screen (EYE_LINEAR projection) using GLSL (fixed function pipeline is working fine). I've read here on the forum for methods of projecting, some tutorials, the nv paper for projecting texturing, but can't find what is wrong. Here is the simplified the code C++ code

void RenderTest()
{
       CMatrix4x4 const c_bias(
						0.5f, 0.0f, 0.0f, 0.0f,
						0.0f, 0.5f, 0.0f, 0.0f,
						0.0f, 0.0f, 0.5f, 0.0f,
						0.5f, 0.5f, 0.5f, 1.0f
					);

	glMatrixMode(GL_MODELVIEW);

	glLoadIdentity();
	glTranslatef(0.0f, 0.0f, -4.0f);
	glRotatef(70.0f, 1.0f, 0.0f, 0.0f);

	CMatrix4x4	camera;
	glGetFloatv(GL_MODELVIEW_MATRIX, camera);

//	CMatrix4x4	camInverse = camera;
//	camInverse.inverse();
//	CMatrix4x4 ifIsIdentity = camera * camInverse;

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(SFOV, 640.0f/480.0f, 0.1, 100.0f);

	CMatrix4x4	proj;
	glGetFloatv(GL_PROJECTION_MATRIX, proj);

	CProgramFactory::Pointer	prg = CProgramFactory::create("data/shaders/mirror_simple.glsl");
	CTextureFactory::Pointer	decal = CTextureFactory::create("data/textures/bricks/bricks.jpg");

	glActiveTextureARB(GL_TEXTURE0);
		decal->bind();
		decal->enable();

		glEnable(GL_TEXTURE_GEN_S);
		glEnable(GL_TEXTURE_GEN_T);
		glEnable(GL_TEXTURE_GEN_R);
		glEnable(GL_TEXTURE_GEN_Q);

		CMatrix4x4	planes;
		planes = c_bias * proj * camera;

		glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
		glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
		glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
		glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);

		glTexGenfv(GL_S, GL_EYE_PLANE, planes.row(0) );
		glTexGenfv(GL_T, GL_EYE_PLANE, planes.row(1) );
		glTexGenfv(GL_R, GL_EYE_PLANE, planes.row(2) );
		glTexGenfv(GL_Q, GL_EYE_PLANE, planes.row(3) );

	glActiveTexture(GL_TEXTURE1);
		decal->bind();
		decal->enable();

		glMatrixMode(GL_TEXTURE);
			glLoadIdentity();
			glLoadMatrixf(c_bias);
			glMultMatrixf(proj ) ;

////		glMultMatrixf(camera);
////		glMultMatrixf(camInverse);
//// not needed, generete identity matrix

	prg->enable();

	glBegin(GL_QUADS);
		glColor3f(1.0f, 1.0f, 1.0f);
		glNormal3f(0.0f, 1.0f, 0.0f);

		float size = 1.5f;
		float y = 0.5f;

		glVertex3f(-size, y,  size);
		glVertex3f( size, y,  size);
		glVertex3f( size, y, -size);
		glVertex3f(-size, y, -size);
	glEnd();

	prg->disable();
}

In texture unit 0, I setup fixed function texgen projection, that is working. In texture unit 1, I setup a texture matrix for the projection. And now the glsl code

[vertex]

void main()
{
	vec4 position =  gl_ModelViewMatrix * gl_Vertex;

/// this is from orange book
	gl_TexCoord[0].s = dot(position, gl_EyePlaneS[0]);
	gl_TexCoord[0].t = dot(position, gl_EyePlaneT[0]);
	gl_TexCoord[0].p = dot(position, gl_EyePlaneR[0]);
	gl_TexCoord[0].q = dot(position, gl_EyePlaneQ[0]);

/// and this from few tutorials
	gl_TexCoord[1] = gl_TextureMatrix[1] * position;

	gl_Position = ftransform();
}

[fragment]

uniform sampler2D	reflectionMap;
uniform sampler2D	decalMap;

void main()
{
	vec2	coords1 = gl_TexCoord[0].st;
	vec2	coords2 = gl_TexCoord[1].st;
	vec2	coords3 = vec2(gl_FragCoord.x/640.0, gl_FragCoord.y/480.0);

	vec4	color1 = texture2D( decalMap, coords1);
	vec4	color2 = texture2D( decalMap, coords2);
	vec4	color3 = texture2D( reflectionMap, coords3);

	gl_FragColor = color1; 
	gl_FragColor = color2; 
	gl_FragColor = color3; // working
}


The GLSL code is validated and I'm checking for GL errors. Can anyone, help me or point me where to look for problem. Thanks in advance.
Advertisement
Sorry to say, texture coordinate generation is part of the fixed function pipeline. You'll have to generate them yourself in GLSL.

The formulae used by fixed function opengl for texcoord generation is given in the the red book (opengl programming guide) if I remember correctly.

Edit: I didn't remember correctly... it's in section 2.11.4 of the gl spec.
[size="1"]
The best thing about using a vertex shader for projective texturing (that's right, you don't even need a fragment shader) is that you don't need to think about eye planes and other non-intuitive concepts. It's the simple camera/projector analogy - you can find the code (and a very good succint explanation IMO) here.
First thanks for the quick response

Quote:Original post by mrbastard
Sorry to say, texture coordinate generation is part of the fixed function pipeline. You'll have to generate them yourself in GLSL.

The formulae used by fixed function opengl for texcoord generation is given in the the red book (opengl programming guide) if I remember correctly.

Edit: I didn't remember correctly... it's in section 2.11.4 of the gl spec.


Hm, I've checked the equations and I think they are implemented by these lines of code (taken as I sad from the orange book). But the result using them is so wrong :-(
	gl_TexCoord[0].s = dot(position, gl_EyePlaneS[0]);	gl_TexCoord[0].t = dot(position, gl_EyePlaneT[0]);	gl_TexCoord[0].p = dot(position, gl_EyePlaneR[0]);	gl_TexCoord[0].q = dot(position, gl_EyePlaneQ[0]);


Quote:Original post by deavik
The best thing about using a vertex shader for projective texturing (that's right, you don't even need a fragment shader) is that you don't need to think about eye planes and other non-intuitive concepts. It's the simple camera/projector analogy - you can find the code (and a very good succint explanation IMO) here.


As it turns out the only change I need to make is in the fragment shader, where I have to substitude the texture2D instruction with texture2DProj instruction. And I think I need a fragment shader. I want to do some ripples and reflection/refraction.

This topic is closed to new replies.

Advertisement