/* Auteur: Nicolas JANEY */ /* Avril 2001 */ /* Gestion des transparences en OpenGL */ #include "windows.h" #include #include #include #include #include static GLfloat view_rotx=1.0F ; static GLfloat view_roty=1.0F ; static GLfloat view_rotz=1.0F ; void myinit(void) { GLfloat light_ambient[] = { 0.0F,0.0F,0.0F,1.0F }; GLfloat light_diffuse[] = { 1.0F,1.0F,1.0F,0.5F }; GLfloat light_specular[] = { 0.0F,0.0F,0.0F,1.0F }; GLfloat light_position0[] = { 1.0F,1.0F,1.0F,0.0F }; glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular); glLightfv(GL_LIGHT0,GL_POSITION,light_position0); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_AUTO_NORMAL); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glEnable(GL_ALPHA_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE); } void display1(void) { float rouge[] = { 1.0F,0.0F,0.0F,0.5F }; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(view_rotx,1.0,0.0,0.0); glRotatef(view_roty,0.0,1.0,0.0); glRotatef(view_rotz,0.0,0.0,1.0); glPushMatrix(); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,rouge) ; auxSolidBox(17.0,5.0,10.0) ; glPopMatrix(); glPopMatrix(); } void display2(void) { float blanc[] = { 1.0F,1.0F,1.0F,0.5F }; glPushMatrix(); glRotatef(view_rotx,1.0,0.0,0.0); glRotatef(view_roty,0.0,1.0,0.0); glRotatef(view_rotz,0.0,0.0,1.0); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,blanc) ; glPushMatrix(); auxSolidBox(9.0,9.0,18.0) ; glPopMatrix(); glPopMatrix(); } void CALLBACK display(void) { glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix() ; display1() ; display2() ; glPopMatrix() ; glFlush(); auxSwapBuffers() ; } void CALLBACK myReshape(int w,int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-11,11,-h*11.0/w,h*11.0/w,-15.0,15.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void CALLBACK keyx(void) { view_rotx += 2 ; } void CALLBACK keyX(void) { view_rotx -= 2 ; } void CALLBACK keyy(void) { view_roty += 2 ; } void CALLBACK keyY(void) { view_roty -= 2 ; } void CALLBACK keyz(void) { view_rotz += 2 ; } void CALLBACK keyZ(void) { view_rotz -= 2 ; } void main(void) { auxInitDisplayMode(AUX_DOUBLE|AUX_RGB|AUX_DEPTH); auxInitPosition(0,0,300,300); auxInitWindow("Transparences"); myinit(); auxKeyFunc(AUX_x,keyx) ; auxKeyFunc(AUX_X,keyX) ; auxKeyFunc(AUX_y,keyy) ; auxKeyFunc(AUX_Y,keyY) ; auxKeyFunc(AUX_z,keyz) ; auxKeyFunc(AUX_Z,keyZ) ; auxReshapeFunc(myReshape); auxMainLoop(display); }