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);
}
projective texture mapping
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.
Anybody have any ideas what could be the problem?
Neutrinohunter
Edit:
In Code!
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement