opengl雾开启

Posted Arikes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl雾开启相关的知识,希望对你有一定的参考价值。

 

 

#include <GL/glut.h>
#include <stdio.h>
#include <iostream>
using namespace std;
static GLint fogMode;

static void init(void){
    GLfloat position [] ={0.5,0.5,3.0,0.0};
    glEnable(GL_DEPTH_TEST);
    glLightfv(GL_LIGHT0,GL_POSITION,position);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    {
        GLfloat mat [3] ={0.1745,0.01175,0.01175};
        glMaterialfv(GL_FRONT,GL_AMBIENT,mat);
        mat[0]=0.61424;mat[1]=0.04136;mat[2]=0.04136;
        glMaterialfv(GL_FRONT,GL_DIFFUSE,mat);
        mat[0]=0.727811;mat[1]=0.626959;mat[2]=0.626959;
        glMaterialfv(GL_FRONT,GL_SPECULAR,mat);
        glMaterialf(GL_FRONT,GL_SHININESS,0.6*128.0);
    }

    glEnable(GL_FOG);
    {
        GLfloat fogColor[4]={0.0,0.8,0.0,1.0};

        fogMode=GL_EXP;
        glFogi(GL_FOG_MODE,fogMode);
        glFogfv(GL_FOG_COLOR,fogColor);
        glFogf(GL_FOG_DENSITY,0.35);
        glHint(GL_FOG_HINT,GL_DONT_CARE);
        glFogf(GL_FOG_START,1.0);
        glFogf(GL_FOG_END,5.0);
    }

    glClearColor(0.0,0.8,0.0,1.0);
}

static void renderSphere(GLfloat x,GLfloat y,GLfloat z){
    glPushMatrix();
    glTranslatef(x,y,z);
    glutSolidSphere(0.4,16,16);
    glPopMatrix();
}

void display(void){
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    renderSphere(-2.,-0.5,-1.0);
    renderSphere(-1.,-0.5,-2.);
    renderSphere(0.,-0.5,-3.);
    renderSphere(1.,-0.5,-4.);
    renderSphere(2.,-0.5,-5.);
    glFlush();
}

void reshape(int w,int h){
    glViewport(0,0,(GLfloat)w,(GLfloat)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(w<=h){
      glOrtho(-2.5,2.5,-2.5*(GLfloat)h/(GLfloat)w,2.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);
    }else{
        glOrtho(-2.5*(GLfloat)w/(GLfloat)h,2.5*(GLfloat)w/(GLfloat)h,-2.5,2.5,-10.0,10.0);
    }
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void keyboard(unsigned char key,int x,int y){
    switch(key){
    case f:
    case F:
        if(fogMode == GL_EXP){
            fogMode = GL_EXP2;
            printf("current fog mode is : GL_EXP2");
            cout<<"current fog mode is : GL_EXP2"<<endl;
        }else if(fogMode ==GL_EXP2){
            fogMode = GL_LINEAR;
            printf("current fog mode is : GL_LINEAR");
            cout<<"current fog mode is : GL_LINEAR"<<endl;
        }else if(fogMode ==GL_LINEAR){
            printf("current fog mode is : GL_EXP");
            cout<<"current fog mode is : GL_EXP"<<endl;
            fogMode = GL_EXP;
        }
        glFogi(GL_FOG_MODE,fogMode);
        glutPostRedisplay();
        break;
    case 27:
        exit(0);
        break;
    default:
        break;
    }
}

int main(int argc,char **argv){
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH|GLUT_MULTISAMPLE);
    glutInitWindowSize(500,500);
    glutCreateWindow(argv[0]);

    init();
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

 

以上是关于opengl雾开启的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES 2.0 雾

当我移动或旋转相机时,OpenGL 雾效果会发生变化

基于Qt的OpenGL可编程管线学习(19)- 雾

OpenGL 雾不出现

✠OpenGL-14-其他技术

OpenGL ES之“深度测试”与“模板测试”的使用流程