阴影

实时阴影渲染

自定义阴影

原理

平面阴影

Pass
        {
            Name "Shadow"
            Blend SrcAlpha OneMinusSrcAlpha
            Stencil//避免阴影重影
            {
                Ref 255
                Comp NotEqual
                Pass Replace
            }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 PositionClip : SV_POSITION;
            };

            float4 _ShadowColor;
            float4 _Offset;

            v2f vert (appdata v)
            {
                v2f o;
                float4 PositinWS=mul(unity_ObjectToWorld,v.vertex);//世界坐标
                float WorldPosY=PositinWS.y;//未被污染的Y值
                PositinWS.y=_Offset.y;//平面
                PositinWS.xz+=_Offset.xz*(WorldPosY-_Offset.y);//控制轴点
                o.PositionClip = mul(UNITY_MATRIX_VP,PositinWS);//裁剪坐标

                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
                return _ShadowColor;
            }
            ENDCG
        }

image

宏阴影

Unity自带的用来渲染阴影的三个宏,分别是SHADOW_COORDS, TRANSFER_SHADOW以及SHADOW_ATTENUATION。

//引入头文件
 #include "AutoLight.cginc"
//输出结构体:
struct v2f {
    //其他属性的声明
    ...

    //声明阴影纹理坐标
    SHADOW_COORDS(2)
};
//顶点Shader:
struct v2f {
    //其他属性的声明
    ...

    //声明阴影纹理坐标
    SHADOW_COORDS(2)
};
//片元Shader:
fixed4 frag(v2f i) : SV_Target {
    //物体表面光照、着色计算

    //使用内置宏对阴影进行采样
    fixed shadow = SHADOW_ATTENUATION(i);

    return fixed4(ambient + (diffuse + specular) * atten * shadow, 1.0);
}
//结束
Fallback "Diffuse"

Shadow Mask

Shadowmask是一种特定于URP的阴影渲染技术。Shadowmask通过使用两个渲染通道来处理实时阴影,其中一个通道用于渲染实时阴影,另一个通道用于渲染静态阴影。这种技术有助于提高渲染性能并减少实时阴影的计算成本。
https://docs.unity3d.com/Manual/LightMode-Mixed-Shadowmask.html
https://cloud.tencent.com/developer/article/1764847

posted @ 2024-10-23 15:17  请明月  阅读(38)  评论(0编辑  收藏  举报