projective texture mapping

Started by
-1 comments, last by Neutrinohunter 16 years, 6 months ago
I have recently been trying to implement some shadowing algorithms and have come unstuck trying to implement this one. The algorithm I have gathered (from various nvidia, ATI and here) for it is: -Set up an orthographic projection -Resize the viewport so that the entire terrain is within the viewing window -Transform the scene using the light's direction vector -Render all scene meshes to the screen -Copy frame buffer to a texture -Reset modelview transformation to look straight down at terrain -Render terrain using the texture we just created -Copy frame buffer to final shadow map texture making use of Render To Texture availability inside OpenGL. I have been following an example which is similar to what I want but I can't see what it wrong with my code: http://gpwiki.org/index.php/Generating_Mesh_Shadows_On_Terrain_Using_OpenGL I only seem to be getting a red quad in the bottom left hand corner of the screen and I'm not sure why.
void createProjectiveTexture(JVector3D lightDir) {

   //create an Image
   GLuint shadowChunk;
   glGenTextures(1, &shadowChunk);
   glBindTexture(GL_TEXTURE_2D, shadowChunk);
   glEnable(GL_TEXTURE_2D);
   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0,0, 256, 256);
   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

   //Set up an Orthographic Projection
   //Ensure the whole scene is withing the viewing window
   const int TEXTURE_MAP_SIZE = 512;
   glViewport(0, 0, TEXTURE_MAP_SIZE,TEXTURE_MAP_SIZE);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(0, TEXTURE_MAP_SIZE, 0, TEXTURE_MAP_SIZE, -10000, 10000);
   glMatrixMode(GL_MODELVIEW);

   //Transform the scee using light vector
   JVector3D lookAt(0,0,0);
   JVector3D up(0,1,0);
   gluLookAtv(lightDir, lookAt, up);

   //Render the Scene
   
 //  drawLightSource();
//   drawFloor();
//   drawBoundingScene();


   //make sure the vertices are inside for some reason they are not
   //at the moment

   static GLint viewport[4];
   static GLdouble modelview[16];
   static GLdouble projection[16];
   static GLfloat winX, winY, winZ;
   
   float minX = 999999, maxX = -999999;
   float minY = 999999, maxY = -999999;
   double X, Y, Z;

   glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
   glGetDoublev( GL_PROJECTION_MATRIX, projection );
   glGetIntegerv( GL_VIEWPORT, viewport );

//   renderVertex(-100.0,0.0,100.0);
//      glTexCoord2f(0.0,5.0);renderVertex(100.0,0.0,100.0);
//      glTexCoord2f(5.0,5.0);renderVertex(100.0,0.0,-100.0);
//      glTexCoord2f(5.0,0.0);renderVertex(-100.0,0.0,-100.0);
   gluProject(100.0,0.0,100.0, modelview, projection, viewport, &X, &Y, &Z);
   if(X < minX) minX = X; if(X > maxX) maxX = X; if(Y < minY) minY = Y;
   if(Y > maxY) maxY = Y;

   gluProject(100.0,0.0,-100.0, modelview, projection, viewport, &X, &Y, &Z);
   if(X < minX) minX = X; if(X > maxX) maxX = X; if(Y < minY) minY = Y;
   if(Y > maxY) maxY = Y;
   gluProject(-100.0,0.0,-100.0, modelview, projection, viewport, &X, &Y, &Z);
   if(X < minX) minX = X; if(X > maxX) maxX = X; if(Y < minY) minY = Y;
   if(Y > maxY) maxY = Y;
   gluProject(-100.0,0.0,100.0, modelview, projection, viewport, &X, &Y, &Z);
   if(X < minX) minX = X; if(X > maxX) maxX = X; if(Y < minY) minY = Y;
   if(Y > maxY) maxY = Y;
   
   static float minX2, minY2, maxX2, maxY2;
                     minX2 = minX;
                     minY2 = minY;
                     maxX2 = maxX;
                     maxY2 = maxY;

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
   glViewport(0, 0, TEXTURE_MAP_SIZE,TEXTURE_MAP_SIZE);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(minX, maxX, minY, maxY, -10000, 10000);
   glMatrixMode(GL_MODELVIEW);

//   glColorMask(false, false, false, false);
//   glColorMask(true, true, true, true);
  //glColor3f(0.0,0.0,0.0);
    drawLightSource();
    drawFloor();
    drawBoundingScene();
    drawScene(true, false, PROJECTED_TEXTURE);
   
   //Use Render to Texture
   glBindTexture(GL_TEXTURE_2D, shadowChunk); 
   glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, TEXTURE_MAP_SIZE, TEXTURE_MAP_SIZE);
   glBindTexture(GL_TEXTURE_2D, 0);
   //Reset View Position to be above the center (0,0,0) along the Y Axis.
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
   glViewport(0, 0, TEXTURE_MAP_SIZE, TEXTURE_MAP_SIZE);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(0, 0, TEXTURE_MAP_SIZE, TEXTURE_MAP_SIZE, -10000, 10000);
   glMatrixMode(GL_MODELVIEW);

   glLoadIdentity();
   glRotatef(90.0f, 1, 0, 0);       //Rotate so XZ becomes XY

   minX = minY = 999999;
   maxX = maxY = -999999;


   glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
   glGetDoublev( GL_PROJECTION_MATRIX, projection );
   glGetIntegerv( GL_VIEWPORT, viewport );

//   renderVertex(-100.0,0.0,100.0);
//      glTexCoord2f(0.0,5.0);renderVertex(100.0,0.0,100.0);
//      glTexCoord2f(5.0,5.0);renderVertex(100.0,0.0,-100.0);
//      glTexCoord2f(5.0,0.0);renderVertex(-100.0,0.0,-100.0);
   gluProject(100.0,0.0,100.0, modelview, projection, viewport, &X, &Y, &Z);
   if(X < minX) minX = X; if(X > maxX) maxX = X; if(Y < minY) minY = Y;
   if(Y > maxY) maxY = Y;

   gluProject(100.0,0.0,-100.0, modelview, projection, viewport, &X, &Y, &Z);
   if(X < minX) minX = X; if(X > maxX) maxX = X; if(Y < minY) minY = Y;
   if(Y > maxY) maxY = Y;
   gluProject(-100.0,0.0,-100.0, modelview, projection, viewport, &X, &Y, &Z);
   if(X < minX) minX = X; if(X > maxX) maxX = X; if(Y < minY) minY = Y;
   if(Y > maxY) maxY = Y;
   gluProject(-100.0,0.0,100.0, modelview, projection, viewport, &X, &Y, &Z);
   if(X < minX) minX = X; if(X > maxX) maxX = X; if(Y < minY) minY = Y;
   if(Y > maxY) maxY = Y;

   glViewport(0, 0, 256,256);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(minX, minY, maxX, maxY, -10000, 10000);
   glMatrixMode(GL_MODELVIEW);
   // rotate view so that xz plane becomes the xy plane
   glLoadIdentity();
   glRotatef(90.0f, 1, 0, 0);

   //Set up projective Texturing and Planes
   float PS[] = {1, 0, 0, 0};
   float PT[] = {0, 1, 0, 0};
   float PR[] = {0, 0, 1, 0};
   float PQ[] = {0, 0, 0, 1};
   
   glTexGenfv(GL_S, GL_EYE_PLANE, PS);
   glTexGenfv(GL_T, GL_EYE_PLANE, PT);
   glTexGenfv(GL_R, GL_EYE_PLANE, PR);
   glTexGenfv(GL_Q, GL_EYE_PLANE, PQ);
   
   glEnable(GL_TEXTURE_GEN_S);
   glEnable(GL_TEXTURE_GEN_T);
   glEnable(GL_TEXTURE_GEN_R);
   glEnable(GL_TEXTURE_GEN_Q);
   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);
   
   glBindTexture(GL_TEXTURE_2D, shadowChunk);

   glMatrixMode(GL_TEXTURE);
   glLoadIdentity();
   glTranslatef(0.5, 0.5, 0);
   glScalef(0.5, 0.5, 1);
   glOrtho(minX2, maxX2, minY2, maxY2, -10000, 10000);
   gluLookAtv(v_LightSource, lookAt, up);
   glMatrixMode(GL_MODELVIEW);
   drawScene(false, false, PROJECTED_TEXTURE);

   //copy final image into texture

   glBindTexture(GL_TEXTURE_2D, shadowChunk);
   glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, TEXTURE_MAP_SIZE, TEXTURE_MAP_SIZE);

   // disable TexGEN - projective texturing
   glDisable(GL_TEXTURE_GEN_S);
   glDisable(GL_TEXTURE_GEN_T);
   glDisable(GL_TEXTURE_GEN_R);
   glDisable(GL_TEXTURE_GEN_Q);

   glMatrixMode(GL_TEXTURE);
   glLoadIdentity();
   
   glMatrixMode(GL_MODELVIEW);
}

Anybody have any ideas what could be the problem? Neutrinohunter Edit: In Code!

This topic is closed to new replies.

Advertisement