opengl混合效果

效果如下图:
   

上图为不同画图顺序下混合的出来的效果图 。

源码:

#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;

}

 例二:
效果图如下:

左图为按下按键a初始效果图;右图为按下r键后物体逐渐互换z轴位置,注意两个效果中混合度跟深度的关系。

源码:

#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;
}

 

posted @ 2016-03-31 21:40  Arikes  阅读(562)  评论(0编辑  收藏  举报