效果如下图:
上图为不同画图顺序下混合的出来的效果图 。
源码:
#include#include 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
例二:
效果图如下:左图为按下按键a初始效果图;右图为按下r键后物体逐渐互换z轴位置,注意两个效果中混合度跟深度的关系。
源码:
#include#include #define MAXZ 8.0#define MINZ -8.0#define ZINC 0.4static 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;}