Hi,
I read some tutorials on shadow mapping and implementing a simple program for it. But i am getting some weird output. Here is my code:
I am copying here minimal code:
render_to_depth()
{
A_VECTOR from[]={5,2,-2};
A_VECTOR at[]={0,0,0};
A_VECTOR up[]={0,1,0};
A_MATRIX mvp_matrix, mv_matrix, normal_matrix, projection_matrix, camera_matrix, model_matrix,temp_matrix;
AMatrixIdentity(&camera_matrix);
AMatrixIdentity(&model_matrix);
AMatrixCreateViewMatrixLH(&camera_matrix,from,at,up,1.0);
AMatrixTranslate(&model_matrix, 0.0f, -2.0f, 0.0f);
AMatrixMultiply(&mv_matrix, &model_matrix, &camera_matrix);
AMatrixIdentity(&projection_matrix);
//nResult |= AMatrixPersp(&projection_matrix, 60.0f, (float)GetViewportWidth()/GetViewportHeight(), 2.0f, 100.0f);
nResult |= AMatrixOrtho(&projection_matrix,-10,10,-10,10,-10,20);
//nResult |= AMatrixOrtho(&projection_matrix,-6,6,-6,6,-6,12);
AMatrixMultiply(&temp_matrix, &camera_matrix, &projection_matrix);
light_mvp=temp_matrix;
AMatrixMultiply(&mvp_matrix, &mv_matrix, &projection_matrix);
glEnable(GL_DEPTH_TEST);
glViewport(0, 0, GetViewportWidth(),GetViewportHeight());
glColorMask(0.0f,0.0f,0.0f,1.0f);
glClearDepth(1.0f);
glClear(GL_DEPTH_BUFFER_BIT);
for(int i=0;i<6;i++)
{
glDrawArrays (GL_TRIANGLE_FAN, i*4, 4);
}
}
create_depth_texture()
{
glGenTextures(1, &depth_texture);
glActiveTexture(GL_TEXTURE7);
glBindTexture(GL_TEXTURE_2D, depth_texture);
glGenRenderbuffers(1, &m_colorBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_colorBuffer);
nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glBindRenderbuffer(GL_RENDERBUFFER, m_colorBuffer);"));
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 32, 32);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_colorBuffer);
glUniform1i(glGetUniformLocation(shader_data.psId,"tk_shadowMap"), 7);
glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT32, GetViewportWidth(),GetViewportHeight(), 0,GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
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_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,GL_TEXTURE_2D,depth_texture,0);
}
main()
{
create_depth_texture();
A_VECTOR from[]={0,5,-10};
A_VECTOR at[]={0,0,0};
A_VECTOR up[]={0,1,0};
AMatrixIdentity(&camera_matrix);
// AMatrixCreateViewMatrixLH(&camera_matrix,from,at,up,1.0);
AMatrixIdentity(&model_matrix);
AMatrixRotate(&model_matrix, ((GLES_Pi/4)), ((GLES_Pi/4)), 0.0f);
AMatrixTranslate(&model_matrix, 0.0f, 0.0f, -2.0f);
AMatrixMultiply(&mv_matrix, &model_matrix, &camera_matrix);
nResult |= AShaderGetUniformLocation(shader_data, "tk_mvMatrix", &modelViewProjectionMatrix);
glUniformMatrix4fv(modelViewProjectionMatrix, 1, GL_FALSE, &mv_matrix._11);
AMatrixIdentity(&projection_matrix);
AMatrixMultiply(&mvp_matrix, &mv_matrix, &projection_matrix);
nResult |= AShaderGetUniformLocation(shader_data, "tk_mvpMatrix", &modelViewProjectionMatrix);
glUniformMatrix4fv(modelViewProjectionMatrix, 1, GL_FALSE, &mvp_matrix._11);
AMatrixIdentity(&normal_matrix);
AMatrixInvertTranspose(&normal_matrix, &mv_matrix);
glUniformMatrix4fv(modelViewProjectionMatrix, 1, GL_FALSE, &normal_matrix._11);
glUniformMatrix4fv(modelViewProjectionMatrix, 1, GL_FALSE, &light_mvp._11);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, id1);
glActiveTexture(GL_TEXTURE7);
glBindTexture(GL_TEXTURE_2D, depth_texture);
for(int i=0;i<6;i++)
{
glDrawArrays(GL_TRIANGLE_FAN,i*4,4);
}
}
Vertex shader:
in vec3 tk_position;
in vec3 tk_texCoord;
in vec3 tk_normal;
out vec2 ps_texCoord;
out vec4 ps_shadowCoord;
out vec3 ps_lightDir;
out vec3 ps_normal;
out vec3 ps_eyeVec;
uniform mat4 tk_mvMatrix;
uniform mat4 tk_mvpMatrix;
uniform mat4 tk_normalMatrix;
uniform mat4 light_mvp;
uniform mat4 biasMatrix;
uniform vec3 tk_lightPos;
void main()
{
//tk_normal=normalize(tk_position);
ps_normal = (tk_normalMatrix * vec4(tk_normal, 1.0)).xyz;
vec4 ePos = tk_mvMatrix * vec4(tk_position, 1.0);
vec4 eLight = tk_mvMatrix * vec4(tk_lightPos, 1.0);
ps_lightDir = normalize(eLight.xyz - ePos.xyz);
ps_eyeVec = -ePos.xyz;
ps_texCoord = tk_texCoord.st;
ps_shadowCoord = biasMatrix* light_mvp * ePos;
gl_Position = tk_mvpMatrix * vec4(tk_position, 1.0);
}
Fragment shader
in vec2 ps_texCoord;
in vec3 ps_lightDir;
in vec3 ps_normal;
in vec3 ps_eyeVec;
in vec4 ps_shadowCoord;
uniform vec4 tk_ambientColor;
uniform vec4 tk_diffuseColor;
uniform vec4 tk_specularColor;
uniform sampler2D tk_diffuseMap;
uniform sampler2D tk_shadowMap;
out vec4 fragColor;
void main()
{
float shadow = 1.0f;
highp float comp = (ps_shadowCoord.z / ps_shadowCoord.w);
highp float depth = texture2DProj(tk_shadowMap, ps_shadowCoord).r;
shadow = comp <= depth ? 1.0 : 0.4;
float diffuseIntensity = max(0.0, dot(normalize(ps_normal), normalize(ps_lightDir)));
vec3 color = shadow * (diffuseIntensity * tk_diffuseColor.rgb) * texture(tk_diffuseMap, ps_texCoord.st).rgb;
fragColor = vec4(color, 1.0);
}
[ATTACH=CONFIG]391[/ATTACH]