美文网首页
Unity URP Shader 支持内置雾效

Unity URP Shader 支持内置雾效

作者: 宅7 | 来源:发表于2021-06-23 14:36 被阅读0次

    环境

    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 支持内置雾效

          本文链接:https://www.haomeiwen.com/subject/thdbyltx.html