Sign in to follow this  
Eitsch

Stencil Shadow Volume (zPass) Again

Recommended Posts

Eitsch    188
i am still trying to get my stencil shadow volumes working. i am using zpass algorithm. my createSilhuette-edges code:
	for(loop=0;loop<part[frame].planezahl*3;loop+=3) // loop through all triangles
		{
			n = fetchnormal;             // set plane normal
			
			NDotL = n.dotProduct(lPos);  // caclulate angle beetween normal and lightdir
			
			if(NDotL>0.0)                // Triangle faces the light
			{
				pT[0] = fetchfirstvertex;
				pT[1] = fetchsecondvertex;
				pT[2] = fetchthirdvertex;
			
				for(int i=0;i<3;i++)    // loop through vertices
				{
					p1 = pT[i];
					p2 = pT[(i+1)%3];
				
					// Loop through silhuetteEdges vector
					bool killed = false;
					for(int i=0;i<silhuetteEdges.size();i++)
					{
					       // if this edge is already pushed back:
						if((p1.compareTo(silhuetteEdges[i].p1)&&p2.compareTo(silhuetteEdges[i].p2))
||(p1.compareTo(silhuetteEdges[i].p2)&&p2.compareTo(silhuetteEdges[i].p1)))
						{
						    // kill neighbour
							silhuetteEdges.erase(silhuetteEdges.begin()+i);
							killed = true;
							break;
						}
					}
					
					// if nothing was killed -> push current edge back
					if(!killed)
					{
						edge temp;
						temp.p1 = p1;
						temp.p2 = p2;
						silhuetteEdges.push_back(temp);
					}
				}
			}
		}

my shadowvolumeRenderfunction:
		glBegin(GL_QUADS);
		for(int i=0;i<silhuetteEdges.size();i++)
		{
			glVertexAttrib1f(AWXExtrudorLocation,0.0);
			glVertex3f(silhuetteEdges[i].p1.x,silhuetteEdges[i].p1.y,silhuetteEdges[i].p1.z);
			glVertex3f(silhuetteEdges[i].p2.x,silhuetteEdges[i].p2.y,silhuetteEdges[i].p2.z);
			
			glVertexAttrib1f(AWXExtrudorLocation,1.0);
			glVertex3f(silhuetteEdges[i].p2.x,silhuetteEdges[i].p2.y,silhuetteEdges[i].p2.z);
			glVertex3f(silhuetteEdges[i].p1.x,silhuetteEdges[i].p1.y,silhuetteEdges[i].p1.z);

		}
		glEnd(); 
i use a vertexshader to extrude. vertexshader is controlled by a vertexattrib
attribute float extrude;

const float extrudeWidth = 0.6;

void main()
{
	float extrudeBool = extrude;


	if(extrudeBool == 1.0)
	{
		gl_FrontColor = vec4(1.0,0.0,0.0,1.0);
		vec4 pos =  gl_ModelViewMatrix * gl_Vertex;
		vec4 temp = pos + (pos - gl_LightSource[0].position) * extrudeWidth;
		gl_Position =  gl_ProjectionMatrix * temp;
	}
	
	else
	{ 
		gl_FrontColor = vec4(1.0,1.0,1.0,1.0);
		gl_Position = gl_ModelViewProjectionMatrix  * gl_Vertex;
	}
}

my stencil setup is correct. but i get strange results (shadow volume is rendered as polygonmode LINES) following image illustrates, that stencil setup and zpass algorithm is correct implemented: (in the stencil pass the sphere is simply rendered at y=0. so i got the shadowed fragments) following image illustrates, that the extrusion code should be ok too: hope you can help me. [Edited by - Eitsch on April 25, 2006 7:47:29 AM]

Share this post


Link to post
Share on other sites
Eitsch    188
i changed clearstencil to 1.

my stencil part is now:

glClearStencil(1);
glPushAttrib(GL_DEPTH_BUFFER_BIT | GL_LIGHTING_BIT | GL_STENCIL_BUFFER_BIT);

glPushAttrib(GL_COLOR_BUFFER_BIT | GL_LIGHTING_BIT | GL_DEPTH_BUFFER_BIT | GL_POLYGON_BIT | GL_STENCIL_BUFFER_BIT);

float pos[] = {0.0,90.0,2.0,1.0};
glLightfv(GL_LIGHT0,GL_POSITION,pos);

glUseProgramObjectARB(shadowshader.p);

glColorMask(0,0,0,0);
glDepthMask(0);
glEnable(GL_CULL_FACE);
glEnable(GL_STENCIL_TEST);

glStencilFunc(GL_ALWAYS,1,0xFFFFFFFFL);

glStencilOp(GL_KEEP,GL_KEEP,GL_INCR);
glFrontFace(GL_CCW);

glPushMatrix();
glTranslatef(wx,5,wz);
level10.data[54].renderExtrusion();
glPopMatrix();


glStencilOp(GL_KEEP,GL_KEEP,GL_DECR);
glFrontFace(GL_CW);

glPushMatrix();
glTranslatef(wx,5,wz);
level10.data[54].renderExtrusion();
glPopMatrix();

glUseProgramObjectARB(NULL);

glPopAttrib();

glEnable(GL_STENCIL_TEST);
glDepthFunc(GL_EQUAL);
glStencilFunc(GL_EQUAL,0,0xFFFFFFFFL);
glStencilFunc(GL_KEEP,GL_KEEP,GL_KEEP);

glDisable(GL_DEPTH_TEST);

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0.0,1.0,0.0,1.0);

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
//glTranslatef(0.0,0.0,-5.0);

glColor4f(0.0,0.0,0.0,0.3);

glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glDepthMask(0);

glBegin(GL_QUADS);
glVertex3f(0.0,0.0,0.0);
glVertex3f(1.0,0.0,0.0);
glVertex3f(1.0,1.0,0.0);
glVertex3f(0.0,1.0,0.0);
glEnd();

glPopMatrix();

glPopMatrix();

glEnable(GL_DEPTH_TEST);

glPopAttrib();



current results:



i have still the problem with the house:



could the vertexdirection (counterclockwise) be the problem here??

[Edited by - Eitsch on April 25, 2006 7:01:06 AM]

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