#include #include #include #include GLboolean doubleBuffer = GL_TRUE; void draw_background() { //big blue square glColor3ub(0,255,255); glBegin(GL_QUADS); glVertex3i(5, 5, 0); glVertex3i(-5, 5, 0); glVertex3i(-5, -5, 0); glVertex3i(5, -5, 0); glEnd(); } void draw_trangle() { /* transparent triangle */ glColor3ub(255, 0, 0); glBegin(GL_TRIANGLES); glVertex3i(-4, -4, 0); glVertex3i(4, -4, 0); glVertex3i(0, 4, 0); glEnd(); } void draw_blue_square() { /* blue square */ glColor3ub(0, 0, 200); glBegin(GL_QUADS); glVertex3i(3, 3, 0); glVertex3i(-3, 3, 0); glVertex3i(-3, -3, 0); glVertex3i(3, -3, 0); glEnd(); } /* ARGSUSED1 */ static void Key(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); } } static void Draw(void) { int win_width, win_height; win_width = glutGet(GLUT_WINDOW_WIDTH); win_height = glutGet(GLUT_WINDOW_HEIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glViewport(0, 0, win_width, win_height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-10, 10, -10, 10, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glDisable(GL_STENCIL_TEST); glStencilMask(0x0); draw_background(); glEnable(GL_STENCIL_TEST); glStencilMask(0x1); glStencilFunc(GL_ALWAYS, 0x1, 0x1); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glDepthMask(GL_FALSE); draw_trangle(); glStencilMask(0x1); glStencilFunc(GL_NOTEQUAL, 0x1, 0x1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glDepthMask(GL_TRUE); draw_blue_square(); if (doubleBuffer) { glutSwapBuffers(); } else { glFlush(); } } static void Args(int argc, char **argv) { GLint i; doubleBuffer = GL_TRUE; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-sb") == 0) { doubleBuffer = GL_FALSE; } else if (strcmp(argv[i], "-db") == 0) { doubleBuffer = GL_TRUE; } } } int main(int argc, char **argv) { GLenum type; glutInit(&argc, argv); Args(argc, argv); type = GLUT_RGB | GLUT_STENCIL; type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; glutInitDisplayMode(type); glutCreateWindow("Stencil Test"); glClearColor(0.0, 0.0, 0.0, 0.0); glutKeyboardFunc(Key); glutDisplayFunc(Draw); glutMainLoop(); return 0; }