Qt_OpenGL:雾程序小测

来源:互联网 发布:pc端登录淘宝 编辑:程序博客网 时间:2024/04/28 13:02

Qt_OpenGL:雾程序小测

//.h

#ifndef FOGTEST_H#define FOGTEST_H#include <QWidget>#include <QtOpenGL>class FogTest : public QGLWidget{    Q_OBJECTpublic:    FogTest(QWidget *parent = 0);    ~FogTest();protected:    void initializeGL();    void paintGL();    void resizeGL(int , int );    void keyPressEvent(QKeyEvent*);private:    void init(void);    void renderSphere(GLfloat x, GLfloat y, GLfloat z);    void display();private:     GLint fogMode;};#endif // FOGTEST_H

//.cpp

#include "fogtest.h"#include <iostream>#include <cmath>#include <glut.h>using std::cout;FogTest::FogTest(QWidget *parent)    : QGLWidget(parent){}void FogTest::init(){    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.5, 0.5, 0.5, 1.0 };        fogMode = GL_EXP;        glFogi(GL_FOG_MODE, fogMode); //设定雾的模式        glFogfv(GL_FOG_COLOR, fogColor);  //设定雾的颜色        glFogf(GL_FOG_DENSITY, 0.35); //设定雾的密度 //模式为LINEAR时不用设置密度        glHint(GL_FOG_HINT, GL_DONT_CARE); //雾的渲染方式        glFogf(GL_FOG_START, 1.0);  //雾的开始位置        glFogf(GL_FOG_END, 5.0);  //雾的结束位置    }    glClearColor( 0.5, 0.5, 0.5, 1.0 );}void FogTest::renderSphere(GLfloat x, GLfloat y, GLfloat z){    glPushMatrix();  //把当前矩阵压入栈    glTranslatef(x, y, z);    glutSolidSphere(0.4, 16, 16);    glPopMatrix();}void FogTest::display(){    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    renderSphere( -2, -0.5, -1.0 );    renderSphere (-1., -0.5, -2.0);    renderSphere (0., -0.5, -3.0);    renderSphere (1., -0.5, -4.0);    renderSphere (2., -0.5, -5.0);    glFlush();}void FogTest::initializeGL(){    init();}void FogTest::paintGL(){    display();}void FogTest::resizeGL(int w, int h){    glViewport(0, 0, (GLsizei)w, (GLsizei)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 FogTest::keyPressEvent(QKeyEvent *event){    switch(event->key()){    case Qt::Key_F:        if(fogMode == GL_EXP){            fogMode = GL_EXP2;            cout << "Fog mode is GL_EXP2\n";        }else if(fogMode == GL_EXP2){            fogMode = GL_LINEAR;            cout << "Fog mode is GL_LINEAR\n";        }else if(fogMode == GL_LINEAR){            fogMode = GL_EXP;            cout << "Fog mode is GL_EXP\n";        }        glFogi(GL_FOG_MODE, fogMode);        break;    case 27:        exit(0);        break;    default:        break;    }}FogTest::~FogTest(){}

VC中源码:

#include <GL/glut.h>#include <math.h>#include <stdlib.h>#include <stdio.h>static GLint fogMode;/*  Initialize depth buffer, fog, light source,  *  material property, and lighting model. */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.5, 0.5, 0.5, 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.5, 0.5, 0.5, 1.0);  /* fog color */}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.0);   renderSphere (0., -0.5, -3.0);   renderSphere (1., -0.5, -4.0);   renderSphere (2., -0.5, -5.0);   glFlush();}void reshape(int w, int h){   glViewport(0, 0, (GLsizei) w, (GLsizei) 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 ("Fog mode is GL_EXP2\n");         }         else if (fogMode == GL_EXP2) {            fogMode = GL_LINEAR;            printf ("Fog mode is GL_LINEAR\n");         }         else if (fogMode == GL_LINEAR) {            fogMode = GL_EXP;            printf ("Fog mode is GL_EXP\n");         }         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);   glutInitWindowSize(500, 500);   glutCreateWindow(argv[0]);   init();   glutReshapeFunc (reshape);   glutKeyboardFunc (keyboard);   glutDisplayFunc (display);   glutMainLoop();   return 0;}


运行结果截图:








0 0
原创粉丝点击