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
}
}
フォールバック「拡散」
}