应用雾

雾是 OpenGL 支持的一种易于使用的特殊效果。在使用雾时,OpenGL 把雾的颜色与完成所有其他颜色计算的几何图元进行混合。雾与几何图元的混合程度取决于几何图元离观察者的距离。雾可以使物体逐渐模糊最终消失在雾色里(就像在雾中远去的父亲的背影)。

在 SetupRC 函数中开启雾化效果。

glClearColor(fLowLight[0], fLowLight[1], fLowLight[2], fLowLight[3]);glEnable(GL_FOG);
glFogfv(GL_FOG_COLOR, fLowLight);
glFogf(GL_FOG_START, 5.0f);
glFogf(GL_FOG_END, 30.0f);
glFogi(GL_FOG_MODE, GL_LINEAR);

开启和关闭雾化:

glEnable(GL_FOG);  glDisable(GL_FOG);

设置雾化的参数使用 glFog:

void glFogi(GLenum pname, GLint param);

void glFogf(GLenum pname, GLfloat param);

void glFogfv(GLenum pname, GLfloat *params);

void glFogiv(GLenum pname, GLint *params);

glFogfv(GL_FOG_COLOR, fLowLight); // 设置雾的颜色与背景色相同

当使用 GL_FOG_COLOR 作为第一个参数时,后面的第二个参数是一个指定雾的颜色的数组。这里我们使用了与背景清除色相同的颜色。

glFogf(GL_FOG_START, 5.0f);

glFogf(GL_FOG_END, 30.0f);

这两行代码设置了雾化的范围,从哪里(离观察者多远)开始雾化,到哪结束(此过程逐渐加深雾色)。在 GL_FOG_END 指定的位置,物体完全雾化,物体的颜色跟雾的颜色是一样的。

雾化方程

glFogi (GL_FOG_MODE, GL_LINEAR); // 使用哪一种雾化方程

雾化方程用于计算从起始到结束的雾化因子(0-1 的范围)。OpenGl 支持的雾化方程如下:

雾化模式 雾化方程
GL_LINEAR f = (end – c) / (end – start)
GL_EXP f = exp(-d * c)
GL_EXP2 f = exp(-(d * c)2)

在方程里,c 是渲染片段离观察平面的距离,end 是 GL_FOG_END 指定的距离。start 是 GL_FOG_START 指定的距离。d 是雾色的浓度。通过 glFogf 设置

glFogf(GL_FOG_DENSITY, 0.5f);

GL_FOG_START 和 GL_FOG_END 只影响 GL_LINEAR 的雾化效果。GL_LINEAR(线性模式)是线性的直线,GL_EXP 和 GL_EXP2(指数模式)是两条特征曲线。如下图雾化浓度值为 0.5 的近似图:

在线性模式下,只需要提供一个距离视点的开始位置和结束位置。从开始位置到结束位置之间,雾的浓度越来越高,浓度的变化和距离成正比。在指数模式下,雾的浓度随着距离的增加呈指数增长。这种模式通常用来用于烟雾、烟幕等效果。

在计算片段到观察平面的距离有两种方式。一种(尤其是在 NVIDIA 的硬件上)计算真实的片段的深度。另一种(尤其是 A 卡上)使用顶点的距离和顶点之间的插值。前者称为片段雾,后者称为顶点雾。片段雾比顶点雾更为复杂,但它显示的效果更好。这两种都可以通过 GL_FOG_HINT 来设置效果。更好的效果需要更大的开销:

glHint(GL_FOG_HINT, GL_NICEST);

更快,但效果较差可以调用:

glHint(GL_FOG_HINT, GL_FASTEST);

具体的效果取决于实现。

雾坐标

我们不一定要 OpenGL 计算雾距离,也可以自己设置雾距离。通过手工调用 glFogCoordf:

void glFogCoordf(GLfoat fFogDistance);

使用雾坐标的前提是,要调用下面的函数更改雾的来源:

glFogi(GL_FOG_COORD_SRC, GL_FOG_COORD);

打开 OpenGl 产生的雾值:

glFogi(GL_FOG_COORD_SRC, GL_FRAGMENT_DEPTH);

在上一篇的代码的 SetupRC 中加入如下代码段:

  glEnable(GL_FOG);glFogfv(GL_FOG_COLOR, fLowLight); glFogf(GL_FOG_START, 0.5f); glFogf(GL_FOG_END, 30.0f); glFogi(GL_FOG_MODE, GL_LINEAR); glHint(GL_FOG_HINT, GL_NICEST); //开启最佳雾化效果

效果图如下:

OpenGL 超级宝典笔记 —— 雾相关推荐

  1. OpenGL超级宝典笔记——累积缓冲区与其他颜色操作

    2019独角兽企业重金招聘Python工程师标准>>> 累积缓冲区 OpenGL除了颜色缓冲区.深度缓冲区.模板缓冲区之外,还有累积缓冲区.累积缓冲区允许你把渲染到颜色缓冲区的值,拷 ...

  2. Opengl超级宝典笔记——空间绘图画点

    2019独角兽企业重金招聘Python工程师标准>>> <h2>3D概念</h2> <ol> <li>像素,计算机显示器中的最小元素. ...

  3. OpenGL超级宝典笔记——遮挡查询 [转]

    目录[-] 遮挡查询之前 包围体 遮挡查询 在一个场景中,如果有有些物体被其他物体遮住了不可见.那么我们就不需要绘制它.在复杂的场景中,这可以减少大量的顶点和像素的处理,大幅度的提高帧率.遮挡查询就是 ...

  4. 【转】OpenGL超级宝典笔记——纹理映射Mipmap

    原文地址 http://my.oschina.net/sweetdark/blog/177812 , 感谢作者,若非法转载请联系本人. 目录[-] Mipmapping Mipmap过滤 构建Mip层 ...

  5. OpenGL超级宝典笔记——光照参数与材料属性

    2019独角兽企业重金招聘Python工程师标准>>> <h3>添加光照</h3> <p>glEnable(GL_LIGHTING);</p ...

  6. OpenGL 超级宝典笔记 —— 纹理高级(一)

    辅助颜色 一般情况下,我们设置纹理的环境为 GL_MODULATE 模式,在这种情况下,受到光照的几何图形会和纹理的颜色进行结合.正常情况下,OpenGL 进行光照计算,并根据标准的光照模型进行单个片 ...

  7. OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13

    OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13 文章目录 OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13 1 帧缓存运算 1.1 裁剪测 ...

  8. OpenGL超级宝典(第7版)笔记20 统一变量 一致区块 uniform相关内容 清单5.9-5.28

    OpenGL超级宝典(第7版)笔记20 统一变量 一致区块 uniform相关内容 清单5.9-5.28 文章目录 OpenGL超级宝典(第7版)笔记20 统一变量 一致区块 uniform相关内容 ...

  9. OpenGL超级宝典学习笔记——操作矩阵

    为了更强大的功能和灵活性,我们有时需要直接操作矩阵.在OpenGL中4x4的矩阵用包含16个浮点数值的一维数组来表示,而不是用二维的4x4的数组来表示.OpenGL之所以这么做,因为使用一维数组更高效 ...

最新文章

  1. [洛谷P5147]随机数生成器
  2. elementui中同时上传多个文件_2019-12-19 element-ui文件上传 一次请求上传多个文件...
  3. CentOS学习笔记(一):中文语言包及输入法的安装使用
  4. Received empty response from Zabbix Agent at [172.16.1.7]...
  5. Redis学习之Sentinel(四)
  6. OpenLayers3 online build
  7. 零基础也能看懂!数据仓库与数据库的这几个问题,你能回答出来吗
  8. 导出到文件_Java项目导出可运行的jar文件
  9. 超级终端软件测试工程师,超级终端是否可用来测试 RS485?
  10. C语言表达式作业,表达式和语句
  11. bcm94352屏蔽第20针脚图_iOS13屏蔽系统更新教程-【转载】
  12. MyX5TbsDemo【体验腾讯浏览服务Android SDK (完整版)】
  13. java获取登录内网ip地址
  14. 汉诺塔问题的总结(1)
  15. 4G图传数传一体机GSLINK实测20180930
  16. win2008不能连接mysql_win2008 r2 安装sql server 2005/2008 无法连接服务器解决方法
  17. 2022年全球市场汽车倒车雷达总体规模、主要生产商、主要地区、产品和应用细分研究报告
  18. 调用对象 “ha-datastoresystem”的“HostDatastoreSystem.QueryVmfsDatastoreCreateOptions” 失败。...
  19. 发明专利申请疑问解答分享
  20. 没必要参加嵌入式开发培训班 (学习嵌入式的资料)

热门文章

  1. zoj 2588 buring bridges (无向图求桥,含重边)
  2. PyQt5中的QtGui.QImage图片显示问题分析
  3. 计算机李维,李维(南京工业大学名师——李维)_百度百科
  4. 旷视 好玩的Thunder Net ,一个超轻量型的检测网络
  5. Scheduled失效原因
  6. scheduled java_java使用@Scheduled注解执行定时任务
  7. DropDownMenu
  8. keycode对照表 空格 回车 F1234567890 等键代码
  9. 指针网络GlobalPointer模型存在的不足以及改进点(思考)
  10. 长期吃黑芝麻、黑豆、黑米能让白发变黑吗? 因人制宜