Directx11教程(47) alpha blend(4)-雾的实现
原文:Directx11教程(47) alpha blend(4)-雾的实现

除了用来实现透明效果之外,我们还可以用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

代码下载:

http://files.cnblogs.com/mikewolf2002/d3d1139-49.zip

http://files.cnblogs.com/mikewolf2002/pictures.zip

posted on 2019-05-06 08:41 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10817647.html

Directx11教程(47) alpha blend(4)-雾的实现相关推荐

  1. Directx11教程十五之Fog(雾)

    首先的本节教程旨在实现雾的特效,程序结构跟SpecularMap那节教程差不多,如下所示: 第一,雾的简介和原理. 雾的实现能帮助游戏实现一种朦朦胧胧的感觉,并且由于视锥体的存在,有些靠近视锥体但是没 ...

  2. Directx11教程(66) D3D11屏幕文本输出(1)

    在D3D10中,通过ID3DX10Font接口对象,我们可以方便的在屏幕上输出文字信息,一个DrawText函数就能解决所有问题,但在D3D11中个,这个变得超级麻烦,因为微软移除了Font接口,要在 ...

  3. Directx11教程(49) stencil的应用-镜面反射

    本教程中,我们利用stencil来实现一个镜面反射效果. 1.首先我们要在D3DClass中增加几个成员变量及函数. ID3D11DepthStencilState* m_depthStencilSt ...

  4. Directx11 教程(2) 基本的windows应用程序框架(2)

    Directx11 教程(2) 基本的windows应用程序框架(2) 原文:Directx11 教程(2) 基本的windows应用程序框架(2) 在本教程中,我们把前面一个教程的代码,进行封装.把 ...

  5. Directx11教程(14) D3D11管线(2)

    Directx11教程(14) D3D11管线(2) 原文:Directx11教程(14) D3D11管线(2) 下面我们来了解一些GPU memory的知识,主要参考资料:http://fgiese ...

  6. STM32 基础系列教程 47 - MD5

    前言 MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信 ...

  7. Directx11教程39 纹理映射(9)

    Directx11教程39 纹理映射(9) 原文:Directx11教程39 纹理映射(9) 在myTutorialD3D11_32中,我们在PlaneModelClass中增加一个纹理Texture ...

  8. Directx11教程四十六之FBX SDK

    在之前的DX11入门系列文章中,有篇有关 Directx11教程四十之加载OBJ模型 读取obj模型数据的博客.不过在obj读取的那篇博客我有些坑并没有说,就是我写的那个obj解析器只能解析特定的ob ...

  9. YUV图像格式进行的ALPHA BLEND操作

    YUV图像格式进行的ALPHA BLEND操作 RGB的alpha blend操作采用如下的公式: 假设 r0 g0 b0 为原始图像的 三个色彩分量, r1 g1 b1 为alpha blend过程 ...

  10. DirectX11教程

    最近在看DirectX11的教程,我对dx的接触也只是皮毛,边看边学吧. 看看网上只有w18767104183翻译了前三章,想着能不能继续他翻译一点呢,希望自己能一起成长. 点击图片是官方网站,译文点 ...

最新文章

  1. Linux----函数中变量的作用域、local关键字。
  2. 图解SQL Server 安全函数的使用
  3. python实现ping某一ip_Python实现ping指定IP的示例
  4. C++primer第一章 开始
  5. Android开发学习之路-PopupWindow和仿QQ左滑删除
  6. Java抽象类/接口
  7. 电脑操作精典密笈60式
  8. xshell远程控制(连接)两个VMware同时启动的Linux操作系统
  9. robocopy 备份_使用Robocopy复制、备份文件夹
  10. Android关系型数据库应用——电话(短信)黑名单 .
  11. 走进晶圆厂,深入了解芯片制造流程
  12. 17.PIO源码详解7-PIO_EP_MEM_ACCESS模块(PIO_EP_MEM_ACCESS.v)剖析
  13. NLP-信息抽取-三元组-联合抽取-多任务学习-2019:CasRel【关系三元组抽取:一种新的级联二元标注框架】【没用CRF】【基于Lic2019比赛】【数据集:NYT、WebNLG】
  14. 《书中圣Inception》隐私策略
  15. 除了Java,还可以培训学习哪些IT技术?
  16. dom4j-1.6.1.jar和jaxen-1.2.0-atlassian-2.jar下载
  17. pspice导入元件Orcad spice模型
  18. WEBGIS开发 模型抽拉效果实现 Cesium EarthSDK
  19. 疲劳载荷与S-N曲线
  20. linux递归强行删除目录和文件

热门文章

  1. 如何处理杀不掉的病毒
  2. oracle秒级查询,oracle 中查询超过10秒以上的sql语句(性能优化)
  3. 云顶之弈机器人法爆_云顶之弈法爆流斗法阵容详解
  4. 设计模式之——策略(Strategy)模式
  5. MyBatis的ResultMaps之一对多关系
  6. 【渝粤教育】电大中专营销策划原理与实务作业 题库
  7. 【渝粤题库】陕西师范大学800009 环境变迁
  8. Pandas系列(四)数据统计函数
  9. (转)Linux中的screen命令使用
  10. 架构设计之Spring-Session分布式集群会话管理