网站大量收购独家精品文档,联系QQ:2885784924
  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

cj80011 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档