Having trouble with shadows here. Pulling hair out. Getting that blind feeling. My cg fragment program always returns a 0 – making black screen of death. cg tutorial book is clear on vert and fragment programs and theory but not how to set up the shadow map in opengl. Been looking at redbook example. Anyhow, time for sanity check. See any obvious problems?
//step 1 create texture map
glActiveTexture(GL_TEXTURE4);
glGenTextures(1,&mTexID);
glBindTexture(GL_TEXTURE_2D, mTexID);
glEnable(GL_TEXTURE_2D);
glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, mmapwidth, mmapheight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glDisable(GL_TEXTURE_2D);
//do other stuff texture state should be saved…
//step 2 move camera to light and draw.
//step 3 calculate texture matrix
static float bias_matrix[16] = {
0.5,0,0,0.5,
0,0.5,0,0.5,
0,0,0.5,0.5,
0,0,0,0.5
};
float proj_matrix[16],lookat_matrix[16];
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
gluPerspective(cfg_cam.fov,cfg_cam.aspect_ratio, cfg_cam.near_plane, cfg_cam.far_plane);
glGetFloatv( GL_MODELVIEW_MATRIX, proj_matrix );
glLoadIdentity();
gluLookAt(pos.x, pos.y, pos.z, look_at.x, look_at.y, look_at.z, 0.0, 1.0, 0.0);
glGetFloatv( GL_MODELVIEW_MATRIX, lookat_matrix );
//throw it away…still in model view
glPopMatrix();
//calculate texture matrix
float temp[16];
matrix_mult(temp, proj_matrix, lookat_matrix);
matrix_mult(tex_matrix, bias_matrix, temp);
//step 4 save tex_matrix to CG vert program. save model matrix to cg vert program. enable texture unit4 use tex2dproj in frag program. multiply by model matrix then texmatrix in vert program.
//step 5 Draw into depth buffer.
//capture image
glActiveTexture(GL_TEXTURE4);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, mTexID);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, mmapwidth, mmapheight,0);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGenfv(GL_S, GL_EYE_PLANE, &tex_matrix[0]);
glEnable(GL_TEXTURE_GEN_S);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGenfv(GL_T, GL_EYE_PLANE, &tex_matrix[4]);
glEnable(GL_TEXTURE_GEN_T);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGenfv(GL_R, GL_EYE_PLANE, &tex_matrix[8]);
glEnable(GL_TEXTURE_GEN_R);
glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGenfv(GL_Q, GL_EYE_PLANE, &tex_matrix[12]);
glEnable(GL_TEXTURE_GEN_Q);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
glDisable(GL_TEXTURE_2D);
//step 6 later on when I want to use the shadow during drawing…
glActiveTexture(GL_TEXTURE4);
glEnable(GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, mTexID );
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glEnable(GL_TEXTURE_GEN_Q);
//draw stuff
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
glDisable(GL_TEXTURE_GEN_Q);
glDisable(GL_TEXTURE_2D);