Qt_OpenGL:霧程序小測
//.h
#ifndef FOGTEST_H
#define FOGTEST_H
#include <QWidget>
#include <QtOpenGL>
class FogTest : public QGLWidget
{
Q_OBJECT
public:
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;
}
運行結果截圖: