博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Directx11教程(47) alpha blend(4)-雾的实现
阅读量:6949 次
发布时间:2019-06-27

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

     除了用来实现透明效果之外,我们还可以用alpha blend来实现雾(fog)的效果。通过逐渐清晰的雾气效果,可以增加场景的真实感。

     雾的效果实现很简单,首先我们要一种颜色来表示雾,通常使用用灰色

     其实雾的效果和视点有很大关系,距离视点越近,雾就越淡,距离越远,雾就越浓。

     最终物体颜色是雾的颜色和计算出的pixel颜色的混合,我们使用的公式如下:

     Final Color = FogFactor * computed pixel color + (1.0 - FogFactor) * FogColor

     可以看出,最终的颜色是雾的颜色和计算的pixel颜色基于雾因子的加权平均。

下面我看看如何计算雾因子:

     首先定义一个雾范围(fogstart, fogend),在这个范围内,雾逐渐由淡变浓,超出fogend后,就完全是雾的颜色了,再假定顶点到视点的距离为ViewDistance,则雾因子的计算公式有以下几种:

1、线性因子

    Linear Fog = (FogEnd - ViewpointDistance) / (FogEnd - FogStart)

2、指数因子

   Exponential Fog = exp2(-abs(ViewpointDistance * FogDensity))

3、二次指数因子

    Exponential Fog 2 = exp2(- (ViewpointDistance * FogDensity) *(ViewpointDistance * FogDensity)) 

 

      下面我们在myTutorialD3D11_41的基础上来实现雾的效果:

首先需要修改的是lighttex.vs和lighttex.ps, 在vs中,我们定义一个常量缓冲,表示fog的参数,然后根据这几个参数来计算雾因子,并把雾因子传递到ps阶段。

lighttex.vs代码:

cbuffer FogBuffer

{
    float fogStart;
    float fogEnd;
    float fogDensity;
    float padding;
};

    // 计算摄像机的位置.

    cameraPosition = mul(input.position, worldMatrix);
    cameraPosition = mul(cameraPosition, viewMatrix);

    // 计算线性雾.   

    output.fogFactor = saturate((fogEnd - cameraPosition.z) / (fogEnd - fogStart));

lighttex.ps代码:

    // 混合雾颜色.

   finalcolor = input.fogFactor * finalcolor1 + (1.0 - input.fogFactor) * fogColor;

       另外在LightTexShaderClass中,也要做一些小改动,增加设置FogBuffer的代码,并在Render函数和 SetShaderParameters中,增加三个参数,用来设置fog。

      最后,在GraphicsClass中,定义四个参数,并把它们传入shader。

float fogColor, fogStart, fogEnd, fogDensity;

// 雾颜色.

fogColor = 0.5f;

// 雾距离.

fogStart = 20.0f;
fogEnd = 80.0f;

fogDensity = 0.04f;

首先用fogColor设置背景,这样很远的地方就是雾的颜色,…

程序执行后,界面如下:

下面我们在vs中尝试修改雾因子的计算方法,看看指数因子和二次指数因子的效果。

指数因子:

fogDensity = 0.04f;

// 计算指数因子.    

output.fogFactor = saturate(exp2(-abs( cameraPosition.z *fogDensity)) );

二次指数因子:

fogDensity = 0.02f;

// 计算指数因子.

output.fogFactor = saturate(exp2(- ( cameraPosition.z *fogDensity)*( cameraPosition.z *fogDensity)) );

完整的代码请参考:

工程文件myTutorialD3D11_42

代码下载:

转载于:https://www.cnblogs.com/mikewolf2002/archive/2012/05/12/2497120.html

你可能感兴趣的文章
词法分析程序
查看>>
Mybatis 动态sql
查看>>
前端基础之css
查看>>
HTML标签权重分值排列
查看>>
sqlserver 2008手工修改表结构,表不能保存的问题与解决方法
查看>>
网址收藏
查看>>
Gtest:Using visual studio 2017 cross platform feature to compile code remotely
查看>>
Android Span的简单使用
查看>>
Aggressive cows 二分不仅仅是查找
查看>>
人的成长,注定是一场孤独的旅途 ...(360doc)
查看>>
iOS开发UI基础—手写控件,frame,center和bounds属性
查看>>
死锁排查的小窍门 --使用jdk自带管理工具jstack
查看>>
unity3d 动态添加地面贴图 草地
查看>>
P1101 单词方阵
查看>>
安卓开发者必备的42个链接
查看>>
DeadLine
查看>>
2018-2019 Exp2 后门原理与实践
查看>>
bzoj5137 [Usaco2017 Dec]Standing Out from the Herd
查看>>
Mysql压缩包版zip的安装方法
查看>>
UWP 动画
查看>>