Unity URP Shader 支持内置雾效

环境

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 中找到定义

ComputeFogFactor

源码中首先根据裁剪空间的z 坐标,将其重映射到【0,farplane】范围内(0到远裁剪面)。

然后源码会根据我们在Lighting 中的设置计算出雾效因子。

2.MixFog 函数也在Core.hlsl 中定义

MixFog

原理即根据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 寄存器声明

你可能感兴趣的:(Unity URP Shader 支持内置雾效)