效果以下圖:
oop
上圖爲不一樣畫圖順序下混合的出來的效果圖 。ui
源碼:spa
#include <GL/gl.h> #include <GL/glut.h> static int leftFirst = GL_TRUE; static void init(void) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glShadeModel(GL_FLAT); glClearColor(0.0,0.0,0.0,0.0); } static void drawLeft() { glBegin(GL_TRIANGLES); glColor4f(1.0f,1.0f,0.0f,0.75f); glVertex3f(0.1f,0.9f,0.0f); glVertex3f(0.1f,0.1f,0.0f); glVertex3f(0.7f,0.5,0.0f); glEnd(); } static void drawRight() { glBegin(GL_TRIANGLES); glColor4f(0.0f,1.0f,1.0f,0.75f); glVertex3f(0.9f,0.9f,0.0f); glVertex3f(0.3f,0.5f,0.0f); glVertex3f(0.9f,0.1,0.0f); glEnd(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); if(leftFirst){ drawLeft(); drawRight(); } else{ drawRight(); drawLeft(); } glFlush(); } void reshape(int w,int h) { glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<h) gluOrtho2D(0.0,1.0,0.0,1.0*(GLfloat)h/(GLfloat)w); else gluOrtho2D(0.0,1.0*((GLfloat)w/(GLfloat)h),0.0,1.0); } void keyboard(unsigned char key,int x,int y) { switch(key) { case 't': case 'T': leftFirst=!leftFirst; glutPostRedisplay(); break; case 27: exit(0); break; default: break; } } int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(200,200); glutCreateWindow(argv[0]); init(); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutDisplayFunc(display); glutMainLoop(); return 0; }
例二:
效果圖以下:code
左圖爲按下按鍵a初始效果圖;右圖爲按下r鍵後物體逐漸互換z軸位置,注意兩個效果中混合度跟深度的關係。blog
源碼:源碼
#include <GL/gl.h> #include <GL/glut.h> #define MAXZ 8.0 #define MINZ -8.0 #define ZINC 0.4 static float solidZ = MAXZ; static float transparentZ = MINZ; static GLuint sphereList,cubeList; static void init(void) { GLfloat mat_specular [] ={1.0,1.0,1.0,0.15}; GLfloat mat_shininess [] ={100.0}; GLfloat position [] ={0.5,0.5,1.0,0.0}; glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular); glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); glLightfv(GL_LIGHT0,GL_POSITION,position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); sphereList = glGenLists(1); glNewList(sphereList,GL_COMPILE); glutSolidSphere(0.4,16,16); glEndList(); cubeList = glGenLists(1); glNewList(cubeList,GL_COMPILE); glutSolidCube(0.6); glEndList(); } void display(void) { GLfloat mat_solid [] ={0.75,0.75,0.0,1.0}; GLfloat mat_zero[] = {0.0,0.0,0.0,1.0}; GLfloat mat_transparent [] ={0.0,0.8,0.8,0.6}; GLfloat mat_emission [] ={0.0,0.3,0.3,0.6}; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(-0.15,-0.15,solidZ); glMaterialfv(GL_FRONT,GL_EMISSION,mat_zero); glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_solid); glCallList(sphereList); glPopMatrix(); glPushMatrix(); glTranslatef(0.15,0.15,transparentZ); glRotatef(15.0,1.0,1.0,0.0); glRotatef(30.0,0.0,1.0,0.0); glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission); glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_transparent); glEnable(GL_BLEND); glDepthMask(GL_FALSE); glBlendFunc(GL_SRC_ALPHA,GL_ONE); glCallList(cubeList); glDepthMask(GL_TRUE); glDisable(GL_BLEND); glPopMatrix(); glutSwapBuffers(); } void reshape(int w,int h) { glViewport(0,0,(GLint)w,(GLint)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h){ glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0); }else{ glOrtho(-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,-10.0,10.0); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void animate(void) { if(solidZ<=MINZ ||transparentZ >= MAXZ) glutIdleFunc(NULL); else{ solidZ-=ZINC; transparentZ+=ZINC; glutPostRedisplay(); } } void keyboard(unsigned char key,int x,int y){ switch(key){ case 'a': case 'A': solidZ = MAXZ; transparentZ = MINZ; glutIdleFunc(animate); break; case 'r': case 'R': solidZ =MAXZ; transparentZ = MINZ; glutPostRedisplay(); break; case 27: exit(0); break; default: break; } } int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(500,500); glutCreateWindow(argv[0]); init(); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutDisplayFunc(display); glutMainLoop(); return 0; }