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.