- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
HLSL实现雾
这个问题通过图片来解答再合适不过了,下面是本文利用layerFog做的一个结果。
所谓layer fog,顾名思义就是被限制在某一层的雾,本文的目的就是描述如何实现了被限制在一定高度范围内的雾效。
1???????? Thanks to Programmable Pipeline
雾效增强场景真实感也不是一天半天了,但无论opengl还是d3d,无论linear(线性衰减)、exp(指数衰减)还是exp2(指数平方衰减),以往实现的雾效都是全局的,要么就都加雾效,要么都不加。在固定渲染流水线的统治时代,想做到“山谷烟雾弥漫,峰顶明月清风”是相当复杂而啰嗦的事。
感谢那些大牛公司和它们的图形精英,他们在享受创造的乐趣之余,想到了我们,给了我们参与创作的机会。可编程流水线的出现,让我们在做类似layer fog这类事情的时候可以直奔主题。
闲话少说,本文不介绍Programmable Pipeline,也不介绍vs,ps,HLSL和effect,相关知识可以参考Directx9 SDK,下面来开始介绍Layer fog。
1???????? Theory
我们知道雾效最终体现在一个颜色的融合因子上,根据这个融合因子的大小,可以确定雾化程度,如果融合因子为factor,雾的颜色为fogColor,场景点本身的颜色为sceneColor则最终雾化后的颜色finalColor应为:
?????? finalColor = sceneColor+factor*(fogColor-sceneColor)??????????????? (0=factor=1)
??? 该融合因子体现了颜色混合中雾的权重,假设雾的浓度函数为fuction(x,y,z), 以视线进入雾层为起点fStart,实现离开雾层(或到达场景物体表面)为结束点fEnd,则factor实际上是function(x,y,z)在从fStart到fEnd这段路径上的积分,如下:
本文的重点是描述layer fog的实现思想,所以采用了最简单的雾效方程,认为在雾层范围内,雾的浓度保持常数不变。则公式变为:
distance(fStart,fEnd)是求两点之间距离的函数,在实际计算中,雾层定义在Y方向,此式往往可用以下公式表示
其中abs函数是取绝对值函数,θ角是射线与XOZ平面的夹角。
下面针对具体情况进行说明。
???
如图所示,layerFog有雾顶(y坐标为fFogTop),雾底(fFogEnd),雾在fFogEnd和fFogTop之间存在,需要保证fFogTopfFogEnd。
由于layerfog的照相机位置存在三种情况
l???????? Camera.yfFogTop
l???????? fFogEndCamera.yfFogTop
l???????? fFogEndCamera.y
场景点ScenePoint位置也存在三种情况
l???????? ScenePoint.yfFogTop
l???????? fFogEnd ScenePoint.yfFogTop
l???????? fFogEnd ScenePoint.y
所以,实际上共有9种组合情况,每种的处理方法有所不同,实际上说白了就一句话“合法范围内积分,超出雾层范围之外不进行积分“,本着这个原则针对每种情况的不同确定积分上下限。
1 Code
本文采用Effect实现该算法,其主要代码如下:
?
texture g_MeshTexture;????????????? // 纹理
?
float4x4 g_matWorld;????????????????? // 物体的世界变换矩阵,由应用程序输入
float4x4 g_matWorldViewProj;??? // World * View * Projection matrix,由应用程序输入
float4?? g_FogParameter;//.x=fogHeight?? .y = fogEnd? .z = fogRange,由应用程序输入
float4?? g_vCamera;????? //摄像机位置,由应用程序输入
float4?? g_FogColor;???? //雾颜色,由应用程序输入
?
//--------------------------------------------------------------------------------------
// 纹理采样器
//--------------------------------------------------------------------------------------
sampler MeshTextureSampler =
sampler_sta
文档评论(0)