Skip to main content
gamedev.net
🔒 Locked

Shadowmapping: wrong shadow-color

Started by ehmdjii 11 replies 2.9k views
Original Post
ehmdjii
ehmdjii
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]
ehmdjii
ehmdjii
*bump*
anyone?
Neutrinohunter
Neutrinohunter
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
ehmdjii
ehmdjii
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.
dpadam450
dpadam450
//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
NBA2K, Madden, Maneater, Killing Floor, Sims 
ehmdjii
ehmdjii
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. :-)
ehmdjii
ehmdjii
btw i finally got it working. i forgot to disable the shadowmap after the first pass.



thanks everybody!
Neutrinohunter
Neutrinohunter
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
ehmdjii
ehmdjii
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.
Neutrinohunter
Neutrinohunter
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?


ehmdjii
ehmdjii
thanks!

my next plan is making this thing available online as a tutorial! ;-)
Neutrinohunter
Neutrinohunter
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
Neutrinohunter
Neutrinohunter
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

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.