Advertisement

Shadow bug

Started by November 25, 2003 01:24 PM
-1 comments, last by cippyboy 21 years, 3 months ago
I just started looking into stenciled shadows and got a lot of demos/sources showing different types of code... and saw that nothing worked for no particular reason... Here`s a piece of the basic code I use for a plane and a simple triangle->

float LightPosition[4]={0,10,0,0.5f};
float PlanePoints[12]={-10,0,-10,-10,0,10,10,0,10,10,0,-10};
float Tri[9]={0,2,0,2,2,0,2,2,2};
void DrawPlane()
{
	glBegin(GL_QUADS);
	glColor3f(1,1,1);
	glVertex3f(PlanePoints[0],PlanePoints[1],PlanePoints[2]);
	glVertex3f(PlanePoints[3],PlanePoints[4],PlanePoints[5]);
	glVertex3f(PlanePoints[6],PlanePoints[7],PlanePoints[8]);
	glVertex3f(PlanePoints[9],PlanePoints[10],PlanePoints[11]);
	glEnd();
}
void DrawTriangle()
{
	glBegin(GL_TRIANGLES);
	glColor3f(1,0,0);
	glVertex3f(Tri[0],Tri[1],Tri[2]);
	glVertex3f(Tri[3],Tri[4],Tri[5]);
	glVertex3f(Tri[6],Tri[7],Tri[8]);
	glEnd();
}
void DrawTri()
{	//somehow brute force but... it`s only a triangle and it`s being hit by the light

	float *v=Tri;
	CVector3 v1(v[0],v[1],v[2]),
		     v2(v[3],v[4],v[5]),v3,v4;
	v3.x=(v1.x-LightPosition[0])*INFINITY;
	v3.y=(v1.y-LightPosition[1])*INFINITY;
	v3.z=(v1.z-LightPosition[2])*INFINITY;
	v4.x=(v2.x-LightPosition[0])*INFINITY;
	v4.y=(v2.y-LightPosition[1])*INFINITY;
	v4.z=(v2.z-LightPosition[2])*INFINITY;
	glBegin( GL_TRIANGLE_STRIP );
			glVertex3f(v1.x, v1.y, v1.z );
			glVertex3f(v1.x+v3.x, v1.y+v3.y, v1.z+v3.z );
			glVertex3f(v2.x, v2.y, v2.z );
			glVertex3f(v2.x+v4.x, v2.y+v4.y, v2.z+v4.z );
	glEnd();
}
void Shadow_Test()
{
	//DrawPlane();

	//DrawTri();	

	glPushAttrib( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT | GL_POLYGON_BIT | GL_STENCIL_BUFFER_BIT );
	glDisable( GL_LIGHTING );					// Turn Off Lighting

	glDepthMask( GL_FALSE );					// Turn Off Writing To The Depth-Buffer

	glDepthFunc( GL_LEQUAL );
	glEnable( GL_STENCIL_TEST );					// Turn On Stencil Buffer Testing

	glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );		// Don''t Draw Into The Colour Buffer

	glStencilFunc( GL_ALWAYS, 1, 0xFFFFFFFFL );
	//

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

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

	glFrontFace( GL_CCW );
	glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
        glColor4f( 0.0f, 0.0f, 0.0f, 0.4f );
	glEnable( GL_BLEND );
	glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
	glStencilFunc( GL_NOTEQUAL, 0, 0xFFFFFFFFL );
	glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
	glPushMatrix();
	glLoadIdentity();	
	glBegin(GL_TRIANGLE_STRIP);//this should make the shadow

		glColor3f(0,0,0);//black above 3 units but...

		glVertex3f(-10, 3,-10);//I don`t see any

		glVertex3f(10, 3,-10);
		glVertex3f( 10, 3,10);
		glVertex3f( -10, 3,10);
	glEnd();
	glDisable(GL_BLEND);
	glPopMatrix();
	glPopAttrib();
}
//I put these on as in NeHe tut->

pfd.cStencilBits=1;
//I clear with this->

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
Me...

Relative Games - My apps

This topic is closed to new replies.

Advertisement