Jump to content
  • Advertisement
Sign in to follow this  
Neutrinohunter

OpenGL projective texture mapping

This topic is 3931 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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!

Share this post


Link to post
Share on other sites
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!