`
tiankefeng0520
  • 浏览: 143087 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习二十六:雾

 
阅读更多

雾效果是就是是远处看的模糊,一种类似于大气效果。雾是在执行了矩阵变换,光照,纹理后才会应用,因此雾效果对上述内容都会产生印象。在大型项目中雾气可以提高性能,因为他可以选择不绘画因为雾气影响而看不见的物体

雾的效果做法:
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;
}

 

 

  • 大小: 13.2 KB
  • 大小: 11.7 KB
  • 大小: 18.2 KB
  • 大小: 14.3 KB
  • 大小: 9.8 KB
分享到:
评论

相关推荐

    Opengl教程

    NEHE的OPENGL教程 第42课 多视窗口… NEHE的OPENGL教程 第42课 多视窗口… NeHe的OPENGL中文教程:第41课 体… NeHe的OPENGL中文教程:第40课 绳… NeHe的OPENGL中文教程:第39课 物… ...怎样开始学习OpenGL

    学习OpenGL必备教程nehe_opengl_chs.chm & 全部课程的源程序

    18:二次几何体 19:粒子系统 20:蒙板 21:线的游戏 22:凹凸映射 23:球面映射 24:扩展 25:变形 26:反射 27:影子 28:贝塞尔曲面 29:Blt函数 30:碰撞检测 31:模型加载 32:拾取游戏 33:TGA文件 34:地形 ...

    一个OPENGL的例程,学习素材绑定滤镜照明和雾化效果

    一个OPENGL的例程,学习素材绑定滤镜照明和雾化效果

    OpenGL编程指南(第四版)(PDF)+源码

    本书是OpenGL ARB推荐的OpenGL 1.4版学习指南。本书首先阐述OpenGL的功能和计算机图形学基本知识,包括状态管理和几何体的绘制、模型变换、视点变换和投影变换、颜色和光照;然后深入探讨一些高级技术,包括反走样、...

    OpenGL 射击游戏 exe

    学习OpenGL的基础综合性完整VC++工程,包含了基础的视图变换,纹理贴图,雾和混合等内容。利用选择制作的简单的OpenGL射击游戏,希望对你的学习有所帮助。

    OpenGL学习源代码 VC6.0

    新手学习OpenGL的好资料,从最简单入门,逐步加深。 可以实现3D物体的旋转,俯视 ,大小变换 ,纹理,光照,混合,透视,雾等 包括多个VC6.0工程:OpenGL程序框架、图形字体、纹理图形字、粒子系统、蒙板。。。等等

    Nehe的OpenGL教程电子书

    学习如何用OpenGL来显示列表。只用一行代码预构建和显示物体。使用预编译物体加速你的程序。不要再一次又一次写重复的代码。让显示列表为你做所有的工作吧!这一章里我们将建造Q-bert金字塔(Q-bert是一款游戏),感谢...

    OpenGL编程指南(第四版) 中文版 pdf

    OpenGL图形系统是一个软件接口 让程序员能够创建交互式程序 使用计算机图形学技术生成具有真实感的图像 本书是OpenGL ARB推荐的OpenGL 1 4版学习指南 本书首先阐述OpenGL的功能和计算机图形学基本知识 包括状态管理...

    OpenGL 射击游戏

    学习OpenGL的基础综合性完整VC++工程,包含了基础的视图变换,纹理贴图,雾和混合等内容。 利用选择制作的简单的OpenGL射击游戏,希望对你的学习有所帮助。

    OpenGL教师示例程序

    这是一个OpenGL程序示例包,里面有关于纹理、光线、材质、视角、阴影、雾效果的示例程序,可以动态修改参数观察变化,非常适合初学者学习!!

    OpenGL ES 3.x游戏开发 上卷 吴亚峰.pdf

    介绍了纹理映射的基本原理与使用,介绍了使用OpenGL ES 3.0开发各种3D基本形状的实现,包括圆柱、圆锥、圆环、螺旋管、几何球以及贝塞尔曲线旋转面等内容,讲解了 3D 模型加载,介绍了混合和雾的基本原理与使用以及...

    OpenGL ES 3.x游戏开发 上卷 高清版

    内容覆盖了学习OpenGL ES 3.x的必知必会的知识到基于OpenGL ES 3.x实现各种基础特效的技术 ● 介绍了OpenGL ES 3.x渲染管线的知识和使用OpenGL ES 3.x的着色语言 ● 介绍了OpenGL ES 3.x中的光照、纹理映射、3 D ...

    OpenGL Programming Guide 7th.pdf

    本书是OpenGL ARB推荐的OpenGL 1.4版学习指南。  本书首先阐述OpenGL的功能和计算机图形学基本知识,包括状态管理和几何体的绘制、模型变换、视点变换和投影变换、颜色和光照;然后深入探讨一些高级技术,包括反...

    OPenGL编程书籍

    学习如何用OpenGL来显示列表。只用一行代码预构建和显示物体。使用预编译物体加速你的程序。不要再一次又一次写重复的代码。让显示列表为你做所有的工作吧!这一章里我们将建造Q-bert金字塔(Q-bert是一款游戏),感谢...

    OpenGL编程指南(第四版).pdf

    本书是OpenGL ARB推荐的OpenGL 1.4版学习指南。本书首先阐述OpenGL的功能和计算机图形学基本知识,包括状态管理和几何体的绘制、模型变换、视点变换和投影变换、颜色和光照;然后深入探讨一些高级技术,包括反走样、...

    基于OpenGL的Android+3D游戏开发技术详解与典型案例(源码)

    本书共分两篇,第一篇介绍了Android 3D游戏... 有一定Android基础的读者通过阅读本书的前半部分便可快速掌握OpenGL ES的基础知识,然后通过7个真实案例的学习迅速掌握Android平台下应用程序的开发。  在职的开发人员

    QT + OPenGL 绘图

    QT+opengl绘图,环境4.7.3 +vs2008,学习两天opengl画的小demo,适合初学者

    OpenGL编程指南(第四版

    该章还提供了一个简单的OpenGL程序,并介绍需要了解的一些基本编程细节,有助于学习后续章节的内容。  ·第2章解释如何创建一个物体的三维几何图形描述,并最终把它绘制到屏幕上。  ·第3章描述三维模型在绘制到...

    Jeff Molofee(NeHe)的OpenGL教程

    本书是OpenGL ARB推荐的OpenGL 1.4版学习指南。本书首先阐述OpenGL的功能和计算机图形学基本知识,包括状态管理和几何体的绘制、模型变换、视点变换和投影变换、颜色和光照;然后深入探讨一些高级技术,包括反走样、...

    Qt 版opengl 完整的代码+详细的中文注释教程

    代码中你将学会三种不同的雾的计算方法,以及怎样设置雾的颜色和雾的范围 根据NeHe教程改写的Qt版openGL程序,完整的代码+详细的中文注释教程 希望大家可以喜欢 一起学习 共同进步 (如果程序运行有问题,请在pro文件...

Global site tag (gtag.js) - Google Analytics