> 文章列表 > Direct3D 12——混合——雾

Direct3D 12——混合——雾

Direct3D 12——混合——雾

实现雾化效果的流程如下:如图所示,首先指明雾的颜色、由摄像机到雾气的最近距离以及雾 的分散范围(即从雾到摄像机的最近距离至雾能完全覆盖物体的这段范围),接下来再将网格三角形上点 的颜色置为原色与雾色的加权平均值:
foggedColor = litColor + s ( fogColor - litColor)
=( 1 - s ) · litColor + s · fogCol or

参数s的范围为[0, 1],由一个以摄像机位置与被覆盖物体表面点之间距离作为参数的函数来确定。 随着该表面点与观察点之间距离的增加,它会被雾气遮挡得愈加朦胧。参数s的定义如下:
Direct3D 12——混合——雾
其中,dist(p,E)为表面点p与摄像机位置E之间的距离。而函数saturate会将其参数限制在区间[0,1]内:

Direct3D 12——混合——雾
图所示为根据距离函数而绘制的s图像。由此可以看岀,当(p,E) ≤ fogStart 时 s = 0,而雾的 颜色则由下式给出:

foggedColor = litColor

换句话说,当物体表面点到摄像机的距离小于fogStart时,雾色就不会改变物体顶点的本色。顾名 思义,只有表面点到摄像机的距离至少为“fogStart”(雾效开始)时,其颜色才会受到雾色的影响。
设 fogEnd = fogStart + fogRange。 当 dist(p, E) ≥ fogEnd 时 s = 1,且雾色为:

foggedColor = fogColor

这便是说,当物体表面点的位置到观察点的距离大于或等于fogEnd时,浓雾会将它完全遮住——所 以我们只能看到雾气的颜色。

从图 中不难看出,当 fogStart < dist(p, E) < fogEnd 时,随着 dist(p, E)从 fogStart 向 fogEnd 递增, 变量 s 也呈线性地由 0 增加至 1 。这表明随着距离的增加,雾色会越来越浓重,而物体原色也愈加寡淡。

Direct3D 12——混合——雾
上图中,根据距离函数而得到的s (雾气的颜色权值)的图像。下图中,根据距离函数而得到的1-s (物体的颜色权值)的图像。随着 s 的增加,(1-s)势必将相应地减少

	float3 toEyeW = gEyePosW - pin.PosW;float distToEye = length(toEyeW);toEyeW /= distToEye; // normalize...............float fogAmount = saturate((distToEye - gFogStart) / gFogRange);litColor = lerp(litColor, gFogColor, fogAmount);