Sign in to follow this  
ehmdjii

Shadowmapping: wrong shadow-color

Recommended Posts

hello, there is problem with my shadowmap implementation. the areas that are shadowed do not have the correct shadow-color. it seems as if the shadow-color is modulated with the shadow-map itself, since i use multitexturing i have regular textures in GL_TEXTURE0 and the shadow-map in GL_TEXTURE1. and since i must have booth textures active in the 3rd and last pass, it seems that the color of the shadow-map at a certain point is modulated into the normal color. what can i do about this? here is the renderloop
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		glOrtho(-10, 10, -10, 10, 0.1, 10.0);
		
		FloatBuffer lpm = FloatBuffer.allocate(16);
		glGetFloatv(GL_PROJECTION_MATRIX, lpm);
		
		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
		new GLU().gluLookAt(2f, 6, 0, 
				0, 0, 0, 
				0, 1, 0); // light view matrix
		
		FloatBuffer lvm = FloatBuffer.allocate(16);
		glGetFloatv(GL_MODELVIEW_MATRIX, lvm);
		
		glViewport(0, 0, sm_size, sm_size);
		
		glEnable(GL_POLYGON_OFFSET_FILL);
		glPolygonOffset(1.1f, 4.0f);
		
		glColorMask(false, false, false, false);
		renderScene(gl);
		glDisable(GL_POLYGON_OFFSET_FILL);
		glActiveTexture(GL_TEXTURE1);
		glEnable(GL_TEXTURE_2D);
		glBindTexture(GL_TEXTURE_2D, sm_id.get(0));
		glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, sm_size, sm_size);
		glColorMask(true, true, true, true);
		
		
	
		
		/**
		 * 2. pass from camera point of view, without light
		 */
		glClear(GL_DEPTH_BUFFER_BIT);
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		new GLU().gluPerspective(45, 1, 0.1, 1000.0);
		
		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
		camera.setOrbit(l, 0.01f, rAngle_roty, rAngle_rotx);
		camera.update(null);

		
		glViewport(0,0,width,height);
		
		glColor4f(0.6f,0.6f,0.6f,1f);
		renderScene(gl);
		
		
		
		/**
		 * 3. Pass from camera point of view with light
		 */
		glColor4f(1,1,1,1);

		//Calculate texture matrix for projection
		//This matrix takes us from eye space to the light's clip space
		//It is postmultiplied by the inverse of the current view matrix when specifying texgen
		Matrix4f biasMatrix = new Matrix4f(	0.5f, 0.0f, 0.0f, 0.0f,
											0.0f, 0.5f, 0.0f, 0.0f,
											0.0f, 0.0f, 0.5f, 0.0f,
											0.5f, 0.5f, 0.5f, 1.0f);	//bias from [-1, 1] to [0, 1]
		Matrix4f lightprojectionMatrix = Matrix4f.fromFloatBuffer(lpm);
		Matrix4f lightviewMatrix = Matrix4f.fromFloatBuffer(lvm);
		
		Matrix4f textureMatrix = biasMatrix.mult(lightprojectionMatrix).mult(lightviewMatrix);


		
		glActiveTexture(GL_TEXTURE1);
		glEnable(GL_TEXTURE_2D);
		//Set up texture coordinate generation.
		glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
		glTexGenfv(GL_S, GL_EYE_PLANE, textureMatrix.getRow(0));
		

		glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
		glTexGenfv(GL_T, GL_EYE_PLANE, textureMatrix.getRow(1));
		

		glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
		glTexGenfv(GL_R, GL_EYE_PLANE, textureMatrix.getRow(2));
		

		glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
		glTexGenfv(GL_Q, GL_EYE_PLANE, textureMatrix.getRow(3));
		
		glEnable(GL_TEXTURE_GEN_S);
		glEnable(GL_TEXTURE_GEN_T);
		glEnable(GL_TEXTURE_GEN_R);
		glEnable(GL_TEXTURE_GEN_Q);

		//Bind & enable shadow map texture
		
		glBindTexture(GL_TEXTURE_2D, sm_id.get(0));
		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

		//Enable shadow comparison
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE);

		//Shadow comparison should be true (ie not in shadow) if r<=texture
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
		
		//Shadow comparison should generate an INTENSITY result
		glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY);


		renderScene(gl);

		//Disable textures and texgen
		glActiveTexture(GL_TEXTURE1);
		glDisable(GL_TEXTURE_2D);
		glDisable(GL_TEXTURE_GEN_S);
		glDisable(GL_TEXTURE_GEN_T);
		glDisable(GL_TEXTURE_GEN_R);
		glDisable(GL_TEXTURE_GEN_Q);
		


[Edited by - ehmdjii on March 2, 2008 5:39:14 AM]

Share this post


Link to post
Share on other sites
Sorry I did send you a reply, meh doesn't look like it saved.

Since your problem is with modulation, try fiddling about with glTexEnvf and changing the Colour modes to GL_REPLACE or GL_COMBINE and see what you get. The weird artefact across the screen usually equates to the projection matrix not being accurate so I would check that.]

I've started to give up and move to shaders with my current implementation, it works well but I hate things that can't change colour except per vertex.

Neutrinohunter

Share this post


Link to post
Share on other sites
thanks for your reply neutrinohunter.

however, when i change the env_mode to gl_replace everything goes white and changing it to gl_combine gives still the same result as with gl_modulate.

Share this post


Link to post
Share on other sites
//Bind & enable shadow map texture

glBindTexture(GL_TEXTURE_2D, sm_id.get(0));
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //This looks like the problem, not sure though.

Try using GLSL, its a lot easier and faster since you don't have to draw the scene 3 times.

Seriously though, you posted this 3 times.......download the source code from paulsprojects that you are using, or figure it out.

http://www.gamedev.net/community/forums/topic.asp?topic_id=483991
http://www.gamedev.net/community/forums/topic.asp?topic_id=484075
http://www.gamedev.net/community/forums/topic.asp?topic_id=484910

Share this post


Link to post
Share on other sites
sorry for posting this problem multiple times. it is just that is not exactly the same problem. ;-) my shadowmapping implementation evolved and the topic slightly changed, so i opened a new thread.

i already read through paul's code several times, but since he is not using texturing, he does not seem to have this problem.

yes, GLSL would be a lot easier, but i am targeting very low end hardware so i cannot rely on shaders. besides, i just wanna know how it works without shaders. :-)

Share this post


Link to post
Share on other sites
btw i finally got it working. i forgot to disable the shadowmap after the first pass.



thanks everybody!

Share this post


Link to post
Share on other sites
Ooh you have nice seethrough shadows, you care to share your source/ideas?

I'm trying to get that effect for multiple lights and possibly ambient occlusion but haven't been able to get that lovely effect.

You using GL_ARB_shadow_ambient? In either case I would like to talk to you about how I can get some sweet looking shadows :)

Neutrinohunter

Share this post


Link to post
Share on other sites
hi

no i am not using shadow_ambient only GL_ARB_shadow, GL_ARB_depth_texture, and GL_ARB_multitexture

the only difference from my implementation and the one at pauls projects is, that it uses texturing and alphatest also in the shadow-pass.

the source is already posted in the first post. it only misses one glDisable(GL_TEXTURE_2D) after the first pass in order to disable the shadowmap.

Share this post


Link to post
Share on other sites
Mmmm so are you doing multi texturing like.

glMultiTex...0(ShadowMap Coords...)
glMutliTex...1(Floor Coords...)

or vice versa.

or are you drawing the floor with glTexCoord then using the texture matrix and glTexGen to transform the coordinates?

And congratulations on getting this working :)

Neutrinohunter

NVM, I looked at the source again and saw all of it was there :p So what is your next plan? Multiple Lights? TSM? PSM? Shaders?


Share this post


Link to post
Share on other sites
I noticed that there was no description of alpha test in your source as far as I can see, so am presuming its the same as Pauls except for the use of multiple texture units?

I'd be very interested in seeing or giving input on such a tutorial. I am eventually aiming to get most of the Shadowing techniques used and compliant for the new OpenGL 3.0 when it comes out.

Neutrinohunter

Share this post


Link to post
Share on other sites
I notice your using Java, any chance I could get a class or jar file to test whether its my drivers which are the problem. I just can't seem to get clear shadows for SM?

Thanks
Neutrinohunter

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