Hello,

I am trying to implement shadow mapping in our game project. I am using render to texture technique with two pass rendering. I have created a FBO first and bound a texture for depth component only. In the first pass, I enable this FBO, disable texture and render my scene from light POV. In the second pass, I pass the depth texture to the shader and render the scene normally. I perform the shadow related calculation in the shader.

But, my code is not working correctly. I am not able to see any shadow. Also, when I render both pass, I see a multiple drawing of the whole world trailing one after another if my camera is looking above a certain angle : 45. If I look below that angle, the rendering looks ok. I have attached the image link below(due to forum restriction, I am only able to put the link, no screenshot). If I disable the first pass, the world looks darker but the trailing scene is gone. I have also attached my codes below.

I have also another confusion. I have disabled texture for the first shadowmap pass. But I send the texture coordinates with my vertex coordinates to the VBO. Will that cause any problem?

I am unable to solve these problems for couple of days.Help is really appreciated.

Image:
dl.dropbox.com/u/4246542/render_trailing_draw.png


FBO Initialization:
Code :
bool ShadowMap::InitN(unsigned int WindowWidth, unsigned int WindowHeight)
{
 
	LightPosition = glm::vec3(50.0f, 40.0f, 50.0f);
	upVector = glm::vec3(0.0f, 1.0f, 0.0f);
 
	glGenTextures(1, &m_shadowMap);
	glBindTexture(GL_TEXTURE_2D, m_shadowMap);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
	glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32,
			WindowWidth, WindowHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
	glBindTexture(GL_TEXTURE_2D, 0);
 
	glGenFramebuffers(1, &m_fbo);
	glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
	glDrawBuffers(0, NULL);
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_shadowMap, 0);
	glBindFramebuffer(GL_FRAMEBUFFER, 0);
 
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_CULL_FACE);
 
 
    GLenum Status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
 
    if (Status != GL_FRAMEBUFFER_COMPLETE) {
        printf("FB error, status: 0x%x\n", Status);
        return false;
    }
 
    return true;
}

Shadow Map Pass
Code :
void Mpp::shadowMapPassW() {
 
	glActiveTexture(GL_TEXTURE1);
	glBindTexture(GL_TEXTURE_2D, 0);
	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D, 0);
 
 
	glViewport(0, 0, windowWidth, windowHeight);
 
	glBindFramebuffer(GL_FRAMEBUFFER, shadowMapFBO.m_fbo);
 
	glClear(GL_DEPTH_BUFFER_BIT);
 
 
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glm::mat4 lightProjection = glm::perspective(45.0f,
			1.0f * windowWidth / windowHeight, 0.125f, 1000.0f);
	glGetFloatv(GL_PROJECTION_MATRIX, shadowMapFBO.LightProjectionMatrix);
 
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glm::mat4 lightModelView = glm::lookAt(shadowMapFBO.LightPosition,
			glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
	glGetFloatv(GL_MODELVIEW_MATRIX, shadowMapFBO.LightModelViewMatrix);
 
	glm::mat4 lmvp = lightProjection * lightModelView;
 
	glCullFace(GL_FRONT);
 
	glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
	glDisable(GL_LIGHTING);
	glDisable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, 0);
 
	glUniform1i(Shader::id_uniform_layer, 0);
	world->render(lmvp);
	printGLError();
 
 
	glBindFramebuffer(GL_FRAMEBUFFER, 0);
 
}

Render Pass:
Code :
void Mpp::renderPassW() {
	static glm::vec3 cCameraPosition = glm::vec3(0.0f, 5.0f, 10.0f);
	static glm::vec3 cLightPosition = glm::vec3(50.0f, 40.0f, 50.0f);
 
	glBindFramebuffer(GL_FRAMEBUFFER, 0);
	glViewport(0, 0, windowWidth, windowHeight);
 
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glm::mat4 modelView = player->getView();
 
	float viewAngle = 45.0f;
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glm::mat4 projection = glm::perspective(viewAngle,
			1.0f * windowWidth / windowHeight, 0.01f, 1000.0f);
	glm::mat4 mvp = projection * modelView;
 
 
	glEnable(GL_TEXTURE_2D);
 
	glActiveTexture(GL_TEXTURE1);
	glBindTexture(GL_TEXTURE_2D, shadowMapFBO.m_shadowMap);
 
	glMatrixMode(GL_TEXTURE);
	glLoadIdentity();
	glTranslatef(0.5f, 0.5f, 0.5f);
	glScalef(0.5f, 0.5f, 0.5f);
	glMultMatrixf(shadowMapFBO.LightProjectionMatrix);
	glMultMatrixf(shadowMapFBO.LightModelViewMatrix);
 
	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D, id_texture_blocks);
 
	glUseProgram(Shader::id_program);
 
	glUniform3fv(Shader::id_uniform_lightPosition, 1,
			glm::value_ptr(cLightPosition));
	glUniform3fv(Shader::id_uniform_CameraPosition, 1,
			glm::value_ptr(*(player->getCoordinates())));
 
	//Enabling color write (previously disabled for light POV z-buffer rendering)
	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
	glUniform1i(Shader::id_shader_shadow, 1);
 
	glUniformMatrix4fv(Shader::id_uniform_mvp, 1, GL_FALSE, glm::value_ptr(mvp));
 
	glEnable(GL_POLYGON_OFFSET_FILL);
	glEnable(GL_CULL_FACE);
 
	glCullFace(GL_BACK);
 
	glUniform1i(Shader::id_uniform_layer, 0);
	world->render(mvp);
	printGLError();
 
}

Vertex shader:
Code :
attribute vec4 coordinates;
uniform   mat4 mvp;
 
//Fragment shader forward variables.
varying vec4 voxel;
 
//shadow map
// Used for shadow lookup
varying vec4 ShadowCoord;
 
uniform vec3 LightPosition, CameraPosition;
 
varying vec3 LightDirection, LightDirectionReflected, CameraDirection, Normal;
 
void main(void) {
 
    //shadow map
    LightDirection = LightPosition - gl_Vertex.xyz;
	LightDirectionReflected = reflect(-LightDirection, gl_Normal);
	CameraDirection = CameraPosition - gl_Vertex.xyz;
	Normal = gl_Normal;
	gl_TexCoord[0] = gl_MultiTexCoord0;
	gl_TexCoord[1] = gl_TextureMatrix[1] * gl_Vertex;
 
    voxel = coordinates;
    //Calculates projection on xyz.
    gl_Position = mvp * vec4(coordinates.xyz, 1);
}

Fragment Shader
Code :
 
 
#extension GL_EXT_gpu_shader4 : enable
 
 
//Rendering layer.
uniform int layer;
 
 
//Colors.
uniform float colorRed;
uniform float colorGreen;
uniform float colorBlue;
uniform float colorAlpha;
 
//Fog density.
uniform float fogDensity;
 
varying vec4 voxel;
 
uniform sampler2D texture;
 
const float N_TEXTURES = 32.0;
 
//////////////////////shadow map
uniform sampler2DShadow ShadowMap;
 
varying vec4 ShadowCoord;
 
varying vec3 LightDirection, LightDirectionReflected, CameraDirection, Normal;
 
void main(void) {
 
    vec2  coord2d;
    float intensity;
 
    vec4 color = texture2D(texture, coord2d);
 
    float z = gl_FragCoord.z / gl_FragCoord.w;
    float fog = clamp(exp(-fogDensity * z * z), 0.2, 1.0);
 
    color.xyz = color.xyz * intensity;
 
	//shadow map
	float Shadow = shadow2DProj(ShadowMap, gl_TexCoord[1]).r;
 
	float NdotLD = max(dot(normalize(LightDirection), Normal), 0.0) * Shadow;
	float Spec = pow(max(dot(normalize(LightDirectionReflected), normalize(CameraDirection)), 0.0), 32.0) * Shadow;
	color.xyz = color.xyz * (0.25 + NdotLD * 0.75 + Spec);
 
    //Final color.
    vec4 fogColor = vec4(colorRed, colorGreen, colorBlue, colorAlpha);
    gl_FragColor = mix(fogColor, color, fog);
 
 
}