1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| void TracerOmbre(vertex_type A, vertex_type B)
{
glPushAttrib( GL_ALL_ATTRIB_BITS );
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, 0xFFFFFFFF );
// First Pass. Increase Stencil Value In The Shadow
glFrontFace( GL_CCW );
glStencilOp( GL_KEEP, GL_KEEP, GL_INCR );
TracerProjection( A, B);
// Second Pass. Decrease Stencil Value In The Shadow
glFrontFace( GL_CW );
glStencilOp( GL_KEEP, GL_KEEP, GL_DECR );
//TracerProjection( A, B);
glFrontFace( GL_CCW );
glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ); // Enable Rendering To Colour Buffer For All Components
// Draw A Shadowing Rectangle Covering The Entire Screen
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
GLfloat Rose[] = {1.0f, 0.5f, 1.0f, 0.04f};
//GLfloat Noir[] = {0.0f, 0.0f, 0.0f, 0.004f};
glColor4fv( Rose );
glEnable( GL_BLEND );
glStencilFunc( GL_NOTEQUAL, 1, 0xFFFFFFFF );
glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
glPushMatrix();
glLoadIdentity();
glBegin( GL_TRIANGLE_STRIP );
/*rectangle vertical face à la caméra*/
glVertex3f(0.1f, -10.0f,-10.0);
glVertex3f(0.1f,10.0f,-10.0);
glVertex3f( 0.1f, -10.0f,10.0);
glVertex3f( 0.1f,10.0f,10.0);
glEnd();
glPopMatrix();
glPopAttrib();
} |
Partager