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...
Shadow bug
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->
Relative Games - My apps
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement
Recommended Tutorials
Advertisement