im having some problems with shadow mapping… been trying to figure this out for a few hours… but im about to give up… this is my first time implementing it so i guess ive missed something… any ideas what i might have done wrong?
thx…
const GLdouble bias[] = {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};
class CSHADOWMAP
{
public:
Init()
{
ShadowShader = new GLSLProgram("Shaders/TexDefault.vert", "Shaders/ShadowMap.frag", "Shaders/ShadowMap.log");
LightPos = vec3(500,500,500);
size = 1024;
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &shadowtex);
glBindTexture(GL_TEXTURE_2D, shadowtex);
glTexImage2D(GL_TEXTURE_2D, 0 , GL_DEPTH_COMPONENT, size, size, 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_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glPushMatrix();
glLoadIdentity();
gluPerspective(45.0f, 1.0f, 1.0f, 10000.0f);
glGetDoublev(GL_MODELVIEW_MATRIX, ProjMatrix);
glLoadIdentity();
gluLookAt(LightPos.x, LightPos.y, LightPos.z,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
glGetDoublev(GL_MODELVIEW_MATRIX, ViewMatrix);
glPopMatrix();
}
GLSLProgram* ShadowShader;
int size;
GLuint shadowtex;
vec3 LightPos;
GLdouble ProjMatrix[16];
GLdouble ViewMatrix[16];
};
void CWORLD::RenderShadowPass()
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, ShadowMap.shadowtex);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadMatrixd(ShadowMap.ProjMatrix);
glMatrixMode(GL_MODELVIEW);
glLoadMatrixd(ShadowMap.ViewMatrix);
glViewport(0, 0, ShadowMap.size, ShadowMap.size);
ShadowMap.ShadowShader->use();
glCullFace(GL_FRONT);
Ground.Render(m_Cam->Position, LightPos, vec3(0.0,0.0,0.0));
Veg.Render(m_Cam->Position, LightPos, vec3(0,0,0));
glCullFace(GL_BACK);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, ShadowMap.size, ShadowMap.size);
ShadowMap.ShadowShader->disable();
void CWORLD::Render(bool* keys, vec2 MouseCoord, vec2 MouseButton)
{
RenderShadowPass();
Update(keys, MouseCoord, MouseButton);
if (WireFrame)
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
else
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
glViewport(0,0,1024,768);
gluPerspective(45.0f, (GLfloat)1024/(GLfloat)768, 1.0f, 10000.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
m_Cam->Update(keys); // glulookat function
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, ShadowMap.shadowtex);
glMatrixMode(GL_TEXTURE);
glLoadMatrixd(bias);
glMultMatrixd(ShadowMap.ProjMatrix);
glMultMatrixd(ShadowMap.ViewMatrix);
glMatrixMode(GL_MODELVIEW);
Ground.ObjectShader->use();
Ground.ObjectShader->sendUniform("ShadowMap", 0);
Ground.Render(m_Cam->Position, LightPos, vec3(0,0,0));
Ground.ObjectShader->disable();
glEnable( GL_BLEND );
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.3);
Veg.ObjectShader->use();
Veg.ObjectShader->sendUniform("ShadowMap", 0);
Veg.ObjectShader->sendUniform("Time", Time);
Veg.Render(m_Cam->Position, LightPos, vec3(0,0.0,0));
Veg.ObjectShader->disable();
glDisable(GL_ALPHA_TEST);
glDisable( GL_BLEND );
//vertex:
#version 110
varying vec3 ViewDir;
varying vec3 LightDir;
uniform vec3 LightPos;
uniform vec3 CamPos;
uniform vec3 ObjPos;
varying vec4 ProjShadow;
uniform sampler2DShadow ShadowMap;
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
vec3 VertPos = gl_Vertex.xyz;
ProjShadow = gl_TextureMatrix[0] * gl_Vertex;
vec3 Normal = normalize(gl_Normal.xyz);
vec3 Tangent = normalize(gl_Color.xyz);
vec3 BiNormal = cross(Tangent,Normal);
mat3 TBN = mat3(Tangent, BiNormal, Normal);
LightDir = LightPos*TBN;//(LightPos - VertPos)*TBN;
ViewDir = (CamPos - VertPos)*TBN;
gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_Vertex.xyz,1.0);
}
// fragment
#version 110
varying vec3 LightDir;
varying vec3 ViewDir;
uniform sampler2D TextureMap;
uniform sampler2D NormalMap;
uniform sampler2D OpicatyMap;
uniform sampler2D SpecularMap;
uniform sampler2DShadow ShadowMap;
varying vec4 ProjShadow;
uniform float NormalMapSize;
uniform float Shininess;
const float ParallaxScale = 0.04;
float GetShadow(vec3 TexCoord, vec3 L);
vec3 GetParallax_TexCoord(vec3 TexCoord, vec3 V, float detail, float max);
vec3 GetParallax_Normal(vec2 TexCoord);
vec3 GetLighting_BlinnPhong(vec3 N, vec3 L, vec3 V, vec3 TexCoord, float specamount);
void main()
{
vec3 nViewDir = normalize(ViewDir);
vec3 nLightDir = normalize(LightDir);
vec3 TexCoord = vec3(gl_TexCoord[0].st,0.0);
vec3 Normal = vec3(0.0,0.0,1.0);
TexCoord = GetParallax_TexCoord(TexCoord, nViewDir, 15.0, 10);
Normal = GetParallax_Normal(TexCoord.xy);//texture2D(NormalMap, TexCoord.xy).rgb;
vec4 Color = texture2D(TextureMap, TexCoord.xy).rgba;
vec3 Brightness = GetLighting_BlinnPhong(Normal, nLightDir, nViewDir, TexCoord, Color.a*1.5);
Brightness = shadow2DProj(ShadowMap, ProjShadow).rrr;
gl_FragColor = Brightness.xxxx;//vec4(Brightness.xxxx*Color.rgb, Color.a); ;//TexCoord.xxxx;//
}
on the plane im rendering this results in a black area where z > 0 and white where z < 0. and the model shadows i render with Veg.Render are nowhere to be seen…