Directx10 龙书笔记- 雾效的实现

雾 : 说白了就是一层有颜色的(一般是白色,灰色) 蒙蒙的感觉 混在光线里面。 不管是白天还是黑天。

龙书里面是这样实现的:

1.  给雾定义一个颜色 float3 gFogColor={0.7f,0.7f,0.7f};

2. 然后呢在顶点着色器里面计算出 顶点级别的雾化需要的颜色加成比例

加成比例: 意思是当距离摄像机,就是你的眼睛越远,雾的浓度越大,就是颜色越深。 根据这个得出一个(0,1)的和距离有关的比例系数

vout.fogLerp = saturate((d-gFogStart)/gFogRange) ; 其中 gFogStart是可见范围,没有雾的范围,gFogRange是不可见范围,超出这个范围就全是雾

saturate是强制为(0,1)这个区间。

3. 在像素着色器像素级别的融合 纹理颜色和雾的颜色

float3 floggedColor = lerp(litColor,gFogColor,pIn.fogLerp);

具体fx代码为:

//=============================================================================
// fog.fx by Frank Luna (C) 2008 All Rights Reserved.
//
// Same as clip.fx, but adds fog in the vertex shader.
// Note that we could do fog in the pixel shader, but if the scene
// has sufficient triangle density, not much is gained.
//=============================================================================

#include "lighthelper.fx"

cbuffer cbPerFrame
{
	Light gLight;
	float3 gEyePosW;
};

cbuffer cbPerObject
{
	float4x4 gWorld;
	float4x4 gWVP;
	float4x4 gTexMtx;
};

cbuffer cbFixed
{
	// For this demo, we hardcode the fog values.  However, in a real
	// application, the program may want to change the fog settings
	// at runtime; for example, to fade the fog in and out based on
	// the time of day or the location of the game player.

	float  gFogStart = 5.0f;
	float  gFogRange = 140.0f;
	float3 gFogColor = {0.7f, 0.7f, 0.7f};
};

// Nonnumeric values cannot be added to a cbuffer.
Texture2D gDiffuseMap;
Texture2D gSpecMap;

SamplerState gTriLinearSam
{
	Filter = MIN_MAG_MIP_LINEAR;
	AddressU = Wrap;
	AddressV = Wrap;
};

struct VS_IN
{
	float3 posL    : POSITION;
	float3 normalL : NORMAL;
	float2 texC    : TEXCOORD;
};

struct VS_OUT
{
	float4 posH    : SV_POSITION;
    float3 posW    : POSITION;
    float3 normalW : NORMAL;
    float2 texC0   : TEXCOORD0;
    float2 texC1   : TEXCOORD1;
    float  fogLerp : FOG;
};

VS_OUT VS(VS_IN vIn)
{
	VS_OUT vOut;

	// Transform to world space space.
	vOut.posW    = mul(float4(vIn.posL, 1.0f), gWorld);
	vOut.normalW = mul(float4(vIn.normalL, 0.0f), gWorld);

	// Transform to homogeneous clip space.
	vOut.posH = mul(float4(vIn.posL, 1.0f), gWVP);

	// Output vertex attributes for interpolation across triangle.
	vOut.texC0  = vIn.texC;
	vOut.texC1  = mul(float4(vIn.texC, 0.0f, 1.0f), gTexMtx);

	float d      = distance(vOut.posW, gEyePosW);
	vOut.fogLerp = saturate( (d - gFogStart) / gFogRange ); 

	return vOut;
}

float4 PS(VS_OUT pIn) : SV_Target
{
	// Get materials from texture maps.
	float alpha    = gDiffuseMap.Sample( gTriLinearSam, pIn.texC0 ).a;

	// Discard pixel if texture alpha < 0.1.  Note that we do this
	// test as soon as possible so that we can potentially exit the shader
	// early, thereby skipping the rest of the shader code.
	clip(alpha - 0.1f);

	float4 diffuse = gDiffuseMap.Sample( gTriLinearSam, pIn.texC1 );
	float4 spec    = gSpecMap.Sample( gTriLinearSam, pIn.texC1 );

	// Map [0,1] --> [0,256]
	spec.a *= 256.0f;

	// Interpolating normal can make it not be of unit length so normalize it.
    float3 normalW = normalize(pIn.normalW);

	// Compute the lit color for this pixel.
    SurfaceInfo v = {pIn.posW, normalW, diffuse, spec};
	float3 litColor = ParallelLight(v, gLight, gEyePosW);

	// Blend the fog color and the lit color.
	float3 foggedColor = lerp(litColor, gFogColor, pIn.fogLerp);

    return float4(foggedColor, alpha);
}

technique10 FogTech
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0, VS() ) );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_4_0, PS() ) );
    }
}

因为这是笔记,详细代码就不贴了,龙书网站有

给个实现效果吧:

时间: 2024-10-26 05:26:42

Directx10 龙书笔记- 雾效的实现的相关文章

Directx10 龙书笔记- 第7章课后题 实现火焰动画

火焰的图片我是没找到,找到了几张雷电的,就在d3dcoder.net 的directx10那本书代码下载的Bolt Animations for Chapter 9  里面 里面很多张图片,由于c++也是初学,一时来不及弄字符串拼接的函数. 只能定义很多个帧bmp 然后一个一个载入了 具体代码是建立在那个"crate" 例子工程, 就是那个木箱子的代码基础上. 添加的代码如下: ID3D10ShaderResourceView* mDiffusePic[9]; 我定义了一个能装9张图片

DirectX10 龙书笔记- 一个颜色立方体程序

这篇是作为学习笔记之用,详细代码在Introduction to 3D Game Programming with Directx10里面的扉页,有个网址 www.d3dcoder.net 里面可以下载 这个程序的效果是: 这个demo展示了基本的directx基本的渲染流程. 首先是渲染管线: 它的作用是根据虚拟摄像机视角生成2D图像的基本步骤. 主要是类为ColoredCubeApp class ColoredCubeApp : public D3DApp { public: Colored

【龙书笔记】语法分析涉及的基础概念简介

本篇笔记是我对龙书第2.3-2.5节内容的理解,主要介绍编译器前端关于语法分析的众多基础概念.下篇笔记将根据本篇笔记的主要内容,实现一个针对简单表达式的后缀式语法翻译器Demo(原书中是java实例,我给出的将是逻辑一致的Python版本的实现). 1. 语法分析(Syntax Analysis) 简单来说,语法分析的任务是分析输入的符号字符串(string of symbols, 通常是词法分析产生的tokens)是否遵循某种语言在其上下文无关文法(context-free grammar)中

【龙书笔记】编译器简介及程序构建过程综述

备注:本文是近期重新阅读编译器经典教材<Compilers Principles, Techniques, & Tools>一书(又称DragonBook,龙书)的其中一篇读书笔记. 1. 什么是编译器 从本质来看,平时提到的"编程语言"其实都是一些助记符,用于向其他人或机器描述我们想要完成的逻辑运算.这些易于人类理解的语言想要被计算机理解并正确执行,就必须被转换成机器码,而完成这一转换过程的软件系统就是编译器. 简言之,编译器其实也是一个计算机程序,它可以读取用一

【龙书笔记】用Python实现一个简单数学表达式从中缀到后缀语法的翻译器(采用递归下降分析法)

上篇笔记介绍了语法分析相关的一些基础概念,本篇笔记根据龙书第2.5节的内容实现一个针对简单表达式的后缀式语法翻译器Demo. 备注:原书中的demo是java实例,我给出的将是逻辑一致的Python版本的实现. 在简单后缀翻译器代码实现之前,还需要介绍几个基本概念. 1. 自顶向下分析法(top-down parsing) 顾名思义,top-down分析法的思路是推导产生式时,以产生式开始符号作为root节点,从上至下依次构建其子节点,最终构造出语法分析树.在具体实现时,它会把输入字符串从左到右

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之8: Chap10: Lighting

这一章讲的是光照.光照(lighting)是Direct3D中非常重要的概念,而与之相对应的是材质(material)的概念.如果没有材质的话,那么光照的作用也无法体现. 在较早一些的关于DirectX 9的编程入门书籍里,一般是使用D3DLIGHT9结构体来建立一个光源,而用D3DMATERIAL9结构体来定义物体的材质.我们要做的就是一些很琐碎的家务活,基本上就是创建这些结构体对象.设定其中的参数.启用光照之类的,至于具体实现的细节就非吾等所需(和所能)操心的了. 不过在我们的"龙书&quo

龙书学习笔记(三)

在将第五章每个示例代码过了一遍之后,大致明白了光照这一章的内容,主要分为四点: 一.光照的类型分为三种,并且均通过结构D3DCOLORVALUE或D3DXCOLOR来表示光线的颜色 环境光(Ambient Light)经其它表面反射到达物体表面,并照亮整个场景,通常用做较低代价的粗略模拟. 漫射光(Diffuse Light)沿着特定的方向传播,到达某个表面后将沿着各个方向均匀反射,因此从各个方向观察物体表面亮度均相同. 镜面光(Specular Light)沿着特定的方向传播,到达一表面后将沿

龙书学习笔记(二)

补线代之余抽空把第四章上色学了,之所以说之余,是因为这一章内容确实不怎么多,不过为了巩固知识,便结合刚学的上色又做了一个小程序. 首先进行回顾,这一章学到的一共有四点: 一.Direct3D中颜色用RGB(Red.Green.Blue)三元组表示,用两种结构来保存 D3DCOLOR,即unsigned long,共32位,分成4个8位项,分别保存Alpha(这玩意的作用会在第七章学到).红.绿.蓝,均在0x00~0xff之间取值(就是0~255) 通过结构体来保存(D3DXCOLOR和D3DCO

【浅墨Unity3D Shader编程】之四 热带雨林篇: 剔除、深度测试、Alpha测试以及基本雾效合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/163.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文介绍了Unity中Shader书写中会用到的剔除.深度测试.Alpha测试以及基