Unity は透明なオブジェクトに影を落とします

Unityバージョン:2019.4.16

次のコードでシェーダーを作成します。

Shader "ChuckLee/ARShadow"
{
	Properties
	{
		_ShadowColor("Shadow Color", Color) = (0.1, 0.1, 0.1, 0.53)
	}
		SubShader
	{
		Tags{ "RenderType" = "Transparent" "Queue" = "Geometry+1" }
		Blend SrcAlpha OneMinusSrcAlpha

		Pass
		{
			Tags{ "LightMode" = "ForwardBase" }

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fwdbase

			#include "UnityCG.cginc"
			#include "AutoLight.cginc" 

			struct appdata
			{
				float4 vertex : POSITION;
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				SHADOW_COORDS(2)
			};

			fixed4 _ShadowColor;

			v2f vert(appdata v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				TRANSFER_SHADOW(o);
				return o;
			}

			fixed4 frag(v2f i) : SV_Target
			{
				fixed atten = SHADOW_ATTENUATION(i);
				return fixed4(_ShadowColor.rgb,saturate(1 - atten)*_ShadowColor.a);
			}
			ENDCG
		}
	}
		FallBack "Diffuse"
}

シェーダにシェーダを追加し、透明オブジェクト、つまり床面にシェーダを与えます

カメラの ClearFlags を SolidColor モードに設定します

最終的な効果は以下の通りです。

URP のバージョンは次のとおりです。

シェーダ "ChuckLee/ARShadowURP" {     プロパティ {         _ShadowColor("影の色", Color) = (0.1, 0.1, 0.1, 0.53)     }


    SubShader {         タグ {"Queue"="Transparent" "RenderType"="Transparent"}

        Pass {             Stencil {                 Ref 1                 Comp 常に                 Pass replace             }




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

            struct appdata {                 float4 頂点 : POSITION;             };

            struct v2f {                 float4 pos : SV_POSITION;                 float4 シャドウ座標: TEXCOORD0;             };


            float4 _ShadowColor;

            v2f vert (appdata v) {                 v2f o;                 o.pos = UnityObjectToClipPos(v.vertex);                 o.shadowCoord = ComputeShadowCoord(o.pos);                 を返します。             }




            float4 frag (v2f i) : SV_Target {                 float atten = SampleShadowmap(i.shadowCoord);                 return _ShadowColor * atten;             }


            終了CG
        }
    }

    フォールバック「拡散」
}
 

HDRP バージョン:

シェーダ "ChuckLee/ARShadowHDRP" {     プロパティ {         _ShadowColor("影の色", Color) = (0.1, 0.1, 0.1, 0.53)     }


    SubShader {         タグ {"Queue"="Transparent" "RenderType"="Transparent"}

        Pass {             Stencil {                 Ref 1                 Comp 常に                 Pass replace             }




            HLSLPROGRAM
            #include "Packages/com.unity.render-pipelines.high-quality/Runtime/ShaderLibrary/Common.hlsl"
            #include "Packages/com.unity.render-pipelines.high-setting/Runtime/ShaderLibrary/Lighting.hlsl 」

            struct appdata {                 float4 頂点 : POSITION;             };

            struct v2f {                 float4 pos : SV_POSITION;                 float4 シャドウ座標: TEXCOORD0;             };


            float4 _ShadowColor;

            v2f vert (appdata v) {                 v2f o;                 o.pos = UnityObjectToClipPos(v.vertex);                 o.shadowCoord = ComputeShadowCoord(o.pos);                 を返します。             }




            float4 frag (v2f i) : SV_Target {                 float atten = HDShadowValue(i.shadowCoord);                 return _ShadowColor * atten;             }


            ENDHLSL
        }
    }

    フォールバック「拡散」
}
 

おすすめ

転載: blog.csdn.net/Abel02/article/details/112286475