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
- Qt_OpenGL:雾程序小测
- Qt_OpenGL:材质小测
- Qt_OpenGL:光源小测
- Qt_OpenGL:纹理映射小测
- Qt_OpenGL:3D图形小测
- Qt_OpenGL小探1
- Qt_OpenGL:光照纹理滤波色彩混合小测
- Qt_OpenGL:3D贴不同纹理小测
- QT_OPENGL+VS2012环境搭建
- Qt浅谈之五十一QT_OpenGL
- QItemSelectionModel/QItemSelection程序小测
- 小程序
- 小程序
- 小程序
- 小程序
- 小程序
- 小程序
- 小程序
- C语言基础(一)
- (二)洞悉linux下的Netfilter&iptables:内核中的ip_tables小觑
- servlet生成图片验证码
- java中的Random函数
- static
- Qt_OpenGL:雾程序小测
- OutOfMemory解决方案
- Java Runnable线程变量共享问题
- linux 开机自动启动程序
- 最大公约数与最大公倍数
- 完美解读Linux中文件系统的目录结构
- NSMutableURLRequest和NSURLConnection用Post方式上传照片
- 基础总结篇之一:Activity生命周期
- 拉迪亚德·吉卜林(Rudyard Kipling)——詩作《如果》<if>