博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenGL超级宝典笔记——雾
阅读量:6940 次
发布时间:2019-06-27

本文共 2096 字,大约阅读时间需要 6 分钟。

hot3.png

应用雾

雾是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); //开启最佳雾化效果

效果图如下:

转载于:https://my.oschina.net/sweetdark/blog/170654

你可能感兴趣的文章
ManagementEventWatcher and System.Management
查看>>
ssh远程控制软件的应用
查看>>
【转载】小卡片,大能量
查看>>
cocos2dx 暴露c++函数给lua
查看>>
firebug “阻挡”
查看>>
创新or抄袭?仿苹果OS开源Pear Linux体验(1)
查看>>
mysql配置讲解
查看>>
DRBD+HeartBeat+NFS 搭建高可用文件共享服务器笔记
查看>>
web数据同步的四种方式
查看>>
拼音输入法雏形原理
查看>>
自动打包备份压缩常用的脚步
查看>>
varnish优化
查看>>
zabbix监控apache
查看>>
那些年,我们一起学过的汇编----之“Hello World!”
查看>>
二、lwip协议栈之telnet
查看>>
大家好
查看>>
APACHE动态和静态编译区别
查看>>
音视频封装格式、编码格式知识
查看>>
Linux 系统开启VNC服务
查看>>
一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之登录窗口调试...
查看>>