Jump to content
  • Advertisement
Sign in to follow this  
Eitsch

Stencil Shadow Volume (zPass) Again

This topic is 4470 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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;
					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.p1)&&p2.compareTo(silhuetteEdges.p2))
||(p1.compareTo(silhuetteEdges.p2)&&p2.compareTo(silhuetteEdges.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.p1.x,silhuetteEdges.p1.y,silhuetteEdges.p1.z);
			glVertex3f(silhuetteEdges.p2.x,silhuetteEdges.p2.y,silhuetteEdges.p2.z);
			
			glVertexAttrib1f(AWXExtrudorLocation,1.0);
			glVertex3f(silhuetteEdges.p2.x,silhuetteEdges.p2.y,silhuetteEdges.p2.z);
			glVertex3f(silhuetteEdges.p1.x,silhuetteEdges.p1.y,silhuetteEdges.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
Advertisement
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
Guest Anonymous Poster
push.

Share this post


Link to post
Share on other sites
Edit: Please use [ source] [ /source] (without the space) aroung long code dumps

have you set up your normals right?

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!