雾效果是就是是远处看的模糊,一种类似于大气效果。雾是在执行了矩阵变换,光照,纹理后才会应用,因此雾效果对上述内容都会产生印象。在大型项目中雾气可以提高性能,因为他可以选择不绘画因为雾气影响而看不见的物体
雾的效果做法:
1.设置雾气的模式 glFogi(GL_FOG_MODE, fogMode[fogfilter])
2.设置雾的颜色 glFogfv(GL_FOG_COLOR, fogColor);
3.设置雾的密度 glFogf(GL_FOG_DENSITY, 0.35f);
4.设置系统如何计算雾气 glHint(GL_FOG_HINT, GL_DONT_CARE);
5.雾气的开始位置 glFogf(GL_FOG_START, 1.0f);
6.雾气的结束位置 glFogf(GL_FOG_END, 5.0f);
7.使用雾气 glEnable(GL_FOG);
glFogi | GL_FOG_MODE | GL_EXP | 充满整个屏幕的基本渲染的雾。它能在较老的PC上工作,因此并不是特别像雾。 F=e-(density*z) EXP雾气只和GL_FOG_DENSITY有关 |
GL_EXP2 | 比GL_EXP更进一步。它也是充满整个屏幕,但它使屏幕看起来更有深度 F=e-(density*z)*e-(density*z) EXP2雾气只和GL_FOG_DENSITY有关 |
||
GL_LINEAR | 最好的渲染模式。物体淡入淡出的效果更自然。 F=end-z/end-start EXP雾气只和GL_FOG_START与GL_FOG_END有关 |
||
GL_FOG_COLOR | 雾气颜色 | ||
GL_FOG_DENSITY | 雾气密度 | ||
GL_FOG_START | 设定雾效距屏幕多近开始 | ||
GL_FOG_END | 设定雾效持续到距屏幕多远 |
雾气效果修正
glHint(GL_FOG_HINT,gl_nicest|gl_fastest|gl_dont_care)
GL_EXP GL_EXP2 GL_LINEAR
雾坐标
显示的为每个顶点指定雾气值。比如顶点1,2,3,4 Z值为-1.那么在雾气效果中这几个顶点的视觉效果应该是一致的,但是通过为每个顶点设置雾坐标。即使他们Z值相同,仍然可以有不同的效果
顶点Z值都为0,但是雾气坐标的分别为0,5,10 顶点Z值为0,-5,-10 不含雾气坐标
调用glFogi(GL_FOG_COORD_SRC, GL_FOG_COORD) 显示为每个顶点指定Z值(雾坐标Z值)可以使用 glFogCoordf (f1) 为每个顶点指定雾坐标
glBegin (GL_TRIANGLES);
glFogCoordf (f1);
glVertex3f (2.0f, -2.0f, 0.0f);
glFogCoordf (f2);
glVertex3f (-2.0f, 0.0f, -5.0f);
glFogCoordf (f3);
glVertex3f (0.0f, 2.0f, -10.0f);
glEnd();
雾DEMO
#include "header.h" static GLint fogMode; static void init(void) { GLfloat position[] = { 0.5, 0.5, 1.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.5); glHint (GL_FOG_HINT, GL_DONT_CARE); glFogf (GL_FOG_START, 6.0); glFogf (GL_FOG_END, 10.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("雾"); init(); glutReshapeFunc (reshape); glutKeyboardFunc (keyboard); glutDisplayFunc (display); glutMainLoop(); return 0; }
雾坐标DEMO
#include "header.h" static GLfloat f1, f2, f3; /* Initialize fog */ static void init(void) { GLfloat fogColor[4] = {0.0, 0.25, 0.25, 1.0}; f1 = 1.0f; f2 = 5.0f; f3 = 10.0f; glEnable(GL_FOG); glFogi (GL_FOG_MODE, GL_EXP); glFogfv (GL_FOG_COLOR, fogColor); glFogf (GL_FOG_DENSITY, 0.25); glHint (GL_FOG_HINT, GL_DONT_CARE); glFogi(GL_FOG_COORD_SRC, GL_FOG_COORD); glClearColor(0.0, 0.25, 0.25, 1.0); /* fog color */ } /* display() draws a triangle at an angle. */ void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0f, 0.75f, 0.0f); glBegin (GL_TRIANGLES); glFogCoordf (f1); glVertex3f (2.0f, -2.0f, 0.0f); glFogCoordf (f2); glVertex3f (-2.0f, 0.0f, -5.0f); glFogCoordf (f3); glVertex3f (0.0f, 2.0f, -10.0f); glEnd(); glutSwapBuffers(); } void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective (45.0, 1.0, 0.25, 25.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity (); glTranslatef (0.0, 0.0, -5.0); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 'c': glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); glutPostRedisplay(); break; case 'C': glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT); glutPostRedisplay(); break; case '1': f1 = f1 + 0.25; glutPostRedisplay(); break; case '2': f2 = f2 + 0.25; glutPostRedisplay(); break; case '3': f3 = f3 + 0.25; glutPostRedisplay(); break; case '8': if (f1 > 0.25) { f1 = f1 - 0.25; glutPostRedisplay(); } break; case '9': if (f2 > 0.25) { f2 = f2 - 0.25; glutPostRedisplay(); } break; case '0': if (f3 > 0.25) { f3 = f3 - 0.25; glutPostRedisplay(); } break; case 'b': glMatrixMode (GL_MODELVIEW); glTranslatef (0.0, 0.0, -0.25); glutPostRedisplay(); break; case 'f': glMatrixMode (GL_MODELVIEW); glTranslatef (0.0, 0.0, 0.25); glutPostRedisplay(); break; case 27: exit(0); break; default: break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(500, 500); glutCreateWindow("雾坐标"); init(); glutReshapeFunc (reshape); glutKeyboardFunc (keyboard); glutDisplayFunc (display); glewInit(); glutMainLoop(); return 0; }
相关推荐
NEHE的OPENGL教程 第42课 多视窗口… NEHE的OPENGL教程 第42课 多视窗口… NeHe的OPENGL中文教程:第41课 体… NeHe的OPENGL中文教程:第40课 绳… NeHe的OPENGL中文教程:第39课 物… ...怎样开始学习OpenGL
OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。...通过研究和理解这段代码,开发者可以学习如何在自己的OpenGL应用程序中添加雾效,提升场景的真实感和视觉吸引力。
在这个教程中,我们将深入学习如何在Qt环境中使用OpenGL实现雾效果。 首先,让我们理解雾的基本概念。在OpenGL中,雾通过调整颜色来模拟空气中的颗粒对光线散射的影响。雾的强度会随着距离的增加而衰减,使得远离...
本压缩包文件“OpenGL中雾的应用.rar”包含了关于如何在OpenGL中实现雾效果的示例程序,帮助开发者学习和理解这一技术。 雾在OpenGL中的应用主要涉及到两个方面:雾的类型和雾的参数设置。雾的类型通常有线性雾、...
OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。在OpenGL中,雾(Fog)是一种常见的特效,它能够为场景增添深度感和真实感,模拟自然环境中的大气散射效果。在本...
18:二次几何体 19:粒子系统 20:蒙板 21:线的游戏 22:凹凸映射 23:球面映射 24:扩展 25:变形 26:反射 27:影子 28:贝塞尔曲面 29:Blt函数 30:碰撞检测 31:模型加载 32:拾取游戏 33:TGA文件 34:地形 ...
#### 二十六、球面映射曲面在OpenGL中的应用 此章节介绍如何在OpenGL中实现球面映射技术。 **技术要点**: - **球面映射原理**:理解球面映射的基本原理及其优势。 - **曲面绘制**:学习如何在OpenGL中绘制经过...
这个“OpenGL.rar_3ds opengl_3ds文件制作_opengl 3ds_opengl 动画_opengl 物体”压缩包包含了与OpenGL相关的多个主题,主要涉及3DS文件的处理、OpenGL动画的制作、多视图显示、3D物体绘制以及图形效果如雾的实现。...
在OpenGL中,雾的设置包括雾的颜色、近端距离、远端距离、雾的类型(线性或指数)。使用`glFogi`或`glFogf`设置雾属性,`glEnable(GL_FOG)`启用雾效果。雾的效果会根据物体距离观察者的距离衰减。 5. **控制与资源...
OpenGL开发者手册,通常被称为OpenGL蓝宝书,是学习和深入理解OpenGL图形库的重要资源。OpenGL是一种广泛应用的跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形,广泛应用于游戏开发、科学可视化、工程设计等领域...
易语言OpenGL雾密度例程源码的学习价值在于,它让初学者了解如何在易语言中集成和使用OpenGL库,以及如何控制OpenGL的高级特性。通过分析和运行这段代码,开发者可以掌握如何创建和修改3D环境的视觉效果,提升自己的...
OpenGL提供了几种雾模式,如线性雾、指数雾和平方指数雾,可以通过调整雾的颜色、距离和密度参数来实现不同的视觉效果。 4. **纹理绑定**:在OpenGL中,纹理绑定是指将图像数据与特定的纹理单元关联的过程。这使得...
通过分析和学习这个源码,开发者不仅可以了解到如何在易语言中调用OpenGL API,还可以掌握如何实现3D场景中的雾效果,以及如何通过用户交互来动态调整这种效果。这对于提升3D图形编程能力,尤其是对易语言编程初学者...
- **第十六课:看起来很棒的雾**:模拟真实世界中的雾效,增加场景的真实感。 #### 六、教程注意事项 - **教程进度**:部分课程可能暂时未完成,教程可能存在跳跃现象。 - **错误反馈**:鼓励读者在发现错误或有...
OpenGL提供了多种雾类型,如线性雾、指数雾等,通过调整雾的颜色和密度,可以创造出不同的视觉效果。 这个"OpenGL教师示例程序"包含这些主题的示例,让学习者能够通过实际操作来探索和理解这些概念。每个示例都允许...
本资源“OpenGL学习实例”提供了一系列的实例,帮助初学者和有经验的开发者深入理解并掌握OpenGL的关键概念和技术。 1. **OpenGL基础知识**: OpenGL是一个跨语言、跨平台的编程接口,用于生成二维、三维图像。它...
这个源码示例为易语言开发者提供了一个学习OpenGL雾效果的起点。通过分析和理解这段代码,开发者可以了解如何在易语言中与OpenGL交互,创建更丰富的3D图形效果。对于希望扩展易语言图形能力的程序员来说,这是一个...
OpenGL 的变换包括从三维空间到二维平面的投影变换、几何变换、投影变换、裁剪变换、视口变换等。OpenGL 的变换是创建三维图形的重要步骤。 OpenGL 颜色 OpenGL 的颜色包括计算机颜色、颜色模式、颜色应用等内容。...