Sign in to follow this  
Geometrian

GLSL ShadowMapping

Recommended Posts

Hello, I'm trying to get GLSL shadowmapping working. I've made functions so that they wouldn't clutter the main. I believe the problem is in the texture matrix projecting. Here's the draw part of the main:
glLibUseShader(BlankShader)

#Clears color/depth buffers, resets matrix
Window.clear()
#Set the view from the light's point of view.
LightView.set_view()
gluLookAt(0,100,0,
          0,0,-4,
          0.0,1.0,0.0)

#Self-explanatory
DrawTeapot()
DrawFloor()

#Not quite sure if this is right.  I'll provide function later.
projmat = glLibShadowGetProjMat([0,100,0],[0,0,-4],5,96,102)
#Render scene to a depth texture.  I've tested this, and I'm sure it works.
depthmap = glLibSceneToDepthMap(512,depthmap)

#Clear window again
Window.clear()
#Set the camera's view (no call to gluLookAt() because camera at origin).
View3D.set_view()

glLightfv(GL_LIGHT0,GL_POSITION,[0,100,0,1.0])

glLibUseShader(ShadowShader)
ShadowShader.pass_shadow_texture(depthmap)

#Not entirely sure about these either.
glMatrixMode(GL_TEXTURE)
glLoadMatrixf(projmat)

DrawTeapot()
DrawFloor()

Here's where the texture matrix is projected:
def glLibShadowGetProjMat(lightpos,center,angle,near,far):
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(angle,1.0,near,far)
    LightProjectionMatrix = glGetFloatv(GL_PROJECTION_MATRIX)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(lightpos[0],lightpos[1],lightpos[2],
              center[0],center[1],center[2],
              0.0,1.0,0.0)
    
    LightViewMatrix = glGetFloatv(GL_MODELVIEW_MATRIX)

    glMatrixMode(GL_TEXTURE)
    glPushMatrix()
    glLoadMatrixf([[0.5,0.0,0.0,0.0],
                   [0.0,0.5,0.0,0.0],
                   [0.0,0.0,0.5,0.0],
                   [0.5,0.5,0.5,1.0]])
    glMultMatrixf(LightProjectionMatrix)
    glMultMatrixf(LightViewMatrix)
    TextureMatrix = glGetFloatv(GL_TEXTURE_MATRIX)
    glPopMatrix()
    return TextureMatrix

Finally, the relevant parts of the shaders:
//RELEVANT VERTEX SHADER SECTION
ProjCoord = gl_TextureMatrix[0]*(gl_ModelViewMatrix*gl_Vertex);
//ProjCoord is then sent to the fragment shader.

//RELEVANT FRAGMENT SHADER SECTION

//color created, set by a phong lighting model here

float rValue = shadow2DProj(shadtex1,ProjCoord).r + 0.3;
rValue = clamp(rValue, 0.0, 1.0);

vec3 CoordPos = ProjCoord.xyz / ProjCoord.w;

if(CoordPos.x>=0.0 && CoordPos.y>=0.0 && CoordPos.x<=1.0 && CoordPos.y<=1.0) {
    color *= rValue;
}

All this doesn't work, though. Strangely, I don't see the teapot object at all (should be about mid-screen here). I do however see the floor (gold on the bottom), which isn't entirely blank. I see a ghost image of the teapot on it, which looks like someone took the depth texture, and combined it with the floor material: Ghost Teapot on Floor Please help me fix this! Thanks, Geometrian

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this