环境
Unity 2019.4
URP7.5.2
如何做
unity 设置部分
在编辑器Lighting 设置中开启雾效
shader 部分
1.引入关键字
#pragma multi_compile_fog
2.顶点着色器中计算雾效因子
输出结构体中添加
half fogFactor;
顶点着色器代码段中添加
o.fogFactor = ComputeFogFactor(o.vertex.z);
3.片元着色器中混合雾效
o.rgb = MixFog(o.rgb, i.fogFactor)
为什么
1.ComputeFogFactor 函数可以在Core.hlsl 中找到定义
源码中首先根据裁剪空间的z 坐标,将其重映射到【0,farplane】范围内(0到远裁剪面)。
然后源码会根据我们在Lighting 中的设置计算出雾效因子。
2.MixFog 函数也在Core.hlsl 中定义
原理即根据Lighting 中的设置和上一步计算出的fogFactor 来计算雾效的浓度(该片元上的),使用该浓度来插值雾效的颜色和片元的颜色。
源码
Shader "Custom/Fog"
{
Properties
{
_Color ("基本颜色", Color) = (1,1,1,1)
}
SubShader
{
Tags
{
"RenderType"="Opaque"
"Queue"="Geometry"
"RenderPipeline" = "UniversalRenderPipeline"
}
Pass
{
HLSLPROGRAM
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog;
struct a2v
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
half fogFactor : TEXCOORD0;
};
CBUFFER_START(UnityPerMaterial)
half4 _Color;
CBUFFER_END
v2f vert(a2v i)
{
v2f o;
o.vertex = TransformObjectToHClip(i.vertex.xyz);
o.fogFactor = ComputeFogFactor(o.vertex.z);
return o;
}
half4 frag(v2f i) : SV_TARGET
{
half4 o = _Color;
o.rgb = MixFog(o.rgb, i.fogFactor);
return o;
}
ENDHLSL
}
}
}
注意事项
1.上述方法中,雾效因子在顶点着色器计算完毕,因此要求模型的顶点分布平均,否则可能出现跳变失真。
解决方案:将ComputeFogFactor 在片元着色器中完成:
float zCS = i.vertex.z * i.vertex.w;//将经过透视除法的顶点反推回裁剪空间
real fogFactor = ComputeFogFactor(zCS);
o.rgb = MixFog(o.rgb, fogFactor);
记得移除顶点输出结构体中不再需要的fogFactor 寄存器声明