使用着色器模拟雾效果

本文介绍了如何使用OpenGL着色器实现雾效果,详细解析了GL_LINEAR、GL_EXP和GL_EXP2三种雾的实现公式,并提供了顶点着色器和片段着色器的代码示例,展示了不开雾和开启雾的视觉效果。
摘要由CSDN通过智能技术生成

上一篇关于天空盒的blog谈到了雾效果,那么这次来讨论一下用着色器实现雾效果的具体实现方法.

雾在大自然中是一种常见的天气现象,比如清晨时分在山上就能看到这种效果.我们可以使用OpenGL轻松地模拟出来,使用固定管线设置GL_FOG_COLOR,GL_FOG_DENSITY,GL_FOG_START,GL_FOG_END,GL_FOG_MODE等GL_FOG系列参数,然后调用glEnable(GL_FOG)最后渲染场景即能看到这种效果了.事实上这种固定管线的实现只是向API传递一些参数而已,而且在OpenGL2.x版本以后就不推荐使用固定管线,甚至在3.x版本之后逐渐废弃了.使用固定管线看似很简单,事实上我们并不清楚它的工作原理,更要命的是在一些新的显卡上使用固定管线会出现一些奇怪的问题,甚至在OpenGL ES 2.0任何固定管线的东西都不能再用了.那么怎么办捏? 嗯...用着色器实现!

首先让我们来看下雾效果的公式:

GL_LINEAR: fogFactor=(end-z)/(end-start)

GL_EXP:        fogFactor=e^(-(density*z))

GL_EXP2:      fogFactor=e^(-(density*z)^2)

雾效果有三种实现公式,EXP2优于EXP,EXP优于LINEAR.这里density相当于GL_FOG_DENSITY即雾的浓度,可以根据个人口味调整,z是摄像机到顶点?片段?(根据雾效果的细致程度而定)的距离(也可以用两者z值之差近似,效果其实差不多,后者没有距离运算效率更高些),e就是数学常量与对数运算密切相关如同PI之于圆.

既然知道了公式,那么是时候上干货了:


Vertex Shader:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值