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
Directx11教程(47) alpha blend(4)-雾的实现的更多相关文章
- Directx11教程(46) alpha blend(3)
原文:Directx11教程(46) alpha blend(3) 现在我们尝试改变box的贴图,使用一张带alpha的dds文件wirefence.dds, 用directx textu ...
- Directx11教程(45) alpha blend(2)
原文:Directx11教程(45) alpha blend(2) 在myTutorialD3D11_40中,我们在场景中再添加一个box,并把box放在水里,实现半透明的效果.如下图所示: ...
- Directx11教程(44) alpha blend(1)
原文:Directx11教程(44) alpha blend(1) 我们知道,D3D11中按Frame来渲染物体,每个Frame中又可能包含若干个primitive,如下面的示意图所示: ...
- Directx11教程(66) D3D11屏幕文本输出(1)
原文:Directx11教程(66) D3D11屏幕文本输出(1) 在D3D10中,通过ID3DX10Font接口对象,我们可以方便的在屏幕上输出文字信息,一个DrawText函数就能解决所 ...
- Directx11教程(54) 简单的基于GS的billboard实现
原文:Directx11教程(54) 简单的基于GS的billboard实现 本章我们用一个billboard的实现来学习D3D11中的GS. 在VS shader中,我们输入的是顶点 ...
- Directx11教程(49) stencil的应用-镜面反射
原文:Directx11教程(49) stencil的应用-镜面反射 本教程中,我们利用stencil来实现一个镜面反射效果. 1.首先我们要在D3DClass中增加几个成员变量及函数. I ...
- Directx11教程(18) D3D11管线(7)
原文:Directx11教程(18) D3D11管线(7) 光栅化阶段(RS)之后,将进入PS/OM阶段. 参考外文资料:http://fgiesen.wordpress.com/2011/07/01 ...
- Directx11教程(57) 环境映射
原文:Directx11教程(57) 环境映射 建好skydome后,如果我们想让其中的某个物体,比如那个球体来映射出周围环境的蓝天白云(不包括自己附近的物体),该怎么做呢?此时可以把这个 ...
- Directx11教程(51) 简单的billboard
原文:Directx11教程(51) 简单的billboard billboard称作公告板,通常用一个quad(四边形)表示[有的billboard用两个正交的quad表示],它的特点 ...
随机推荐
- AdaBoost笔记之代码
最近要做二分类问题,先Mark一下知识点和代码,参考:Opencv2.4.9源码分析——Boosting 以下内容全部转自此文 一 原理 二 opencv源码 1.先看构建Boosting的参数: ...
- 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据
ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据 最近碰巧发现一款比较好的Web即时通讯前端组件,layim,百度关键字即可,我下面要做的就是基于这个前 ...
- Java虚拟机系列(二)---HotSpot虚拟机对象
都知道Java是一门面向对象的编程语言,在Java程序运行过程中,无时无刻不在创建对象,所以这节来总结一下HotSpot虚拟机中的Java对象. 一.Java虚拟机对象的创建过程. 在语义层面创建一个 ...
- 【DM8168学习笔记5】EZSDK目录结构
EZSDK5.02的目录结构与之前的版本不同,之前的版本各个组件都放在/ezsdk目录下,5.02做了整合. 之前版本:(图片摘自:3.DM816x_1-day_Workshop-Getting_St ...
- ajax返回后台编译时都对,返回error
首先看看你的dataType:‘json’ 类型是否与后台获取的类型一直.特别是json的格式对不对. 第二: 红括号里的有没有加
- leetcode 850. Rectangle Area II
给定一些矩形2 求覆盖面积 矩形不超过200个 1 算法1 朴素思想 虽然朴素但是代码却有意思 利用容斥原理 复杂度高达 N*2^N class Solution: def intersect(rec ...
- TZOJ 5110 Pollutant Control(边数最少最小割最小字典序输出)
描述 It's your first day in Quality Control at Merry Milk Makers, and already there's been a catastrop ...
- Leetcode492.Construct the Rectangle构造矩形
作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的. 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面.要求: 1. 你设计的矩形页面必 ...
- django模块安装环境变量
django 模块 一 安装: 方法一: (在 JetBrains PyCharm 2017.2 软件的) 设置 (里找到) 项目:python +(添加) (搜索) django Install p ...
- Codeforces 467D
题目链接 D. Fedor and Essay time limit per test 2 seconds memory limit per test 256 megabytes input stan ...