JOGL hardware based shadow mapping - computing the texture matrix
- by axel22
I am implementing hardware shadow mapping as described here.
I've rendered the scene successfully from the light POV, and loaded the depth buffer of the scene into a texture. This texture has correctly been loaded - I check this by rendering a small thumbnail, as you can see in the screenshot below, upper left corner. The depth of the scene appears to be correct - objects further away are darker, and that are closer to the light are lighter.
However, I run into trouble while rendering the scene from the camera's point of view using the depth texture - the texture on the polygons in the scene is rendered in a weird, nondeterministic fashion, as shown in the screenshot.
I believe I am making an error while computing the texture transformation matrix, but I am unsure where exactly.
Since I have no matrix utilities in JOGL other then the gl[Load|Mult]Matrix procedures, I multiply the matrices using them, like this:
void calcTextureMatrix() {
glPushMatrix();
glLoadIdentity();
glLoadMatrixf(biasmatrix, 0);
glMultMatrixf(lightprojmatrix, 0);
glMultMatrixf(lightviewmatrix, 0);
glGetFloatv(GL_MODELVIEW_MATRIX, shadowtexmatrix, 0);
glPopMatrix();
}
I obtained these matrices by using the glOrtho and gluLookAt procedures:
glLoadIdentity()
val wdt = width / 45
val hgt = height / 45
glOrtho(wdt, -wdt, -hgt, hgt, -45.0, 45.0)
glGetFloatv(GL_MODELVIEW_MATRIX, lightprojmatrix, 0)
glLoadIdentity()
glu.gluLookAt(
xlook + lightpos._1, ylook + lightpos._2, lightpos._3,
xlook, ylook, 0.0f,
0.f, 0.f, 1.0f)
glGetFloatv(GL_MODELVIEW_MATRIX, lightviewmatrix, 0)
My bias matrix is:
float[] biasmatrix = new float[16] {
0.5f, 0.f, 0.f, 0.f,
0.f, 0.5f, 0.f, 0.f,
0.f, 0.f, 0.5f, 0.f,
0.5f, 0.5f, 0.5f, 1.f
}
After applying the camera projection and view matrices, I do:
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)
glTexGenfv(GL_S, GL_EYE_PLANE, shadowtexmatrix, 0)
glEnable(GL_TEXTURE_GEN_S)
for each component.
Does anybody know why the texture is not being rendered correctly?
Thank you.