如何在unity的URP下實現陰影

如果你之前是用buildin pipeline寫的shader,其中用了SHADOW_ATTENUATION宏的話,在URP下會失效。

由於官方文檔對自定義shader描述不多,所以自己只能去看URP內建的shader源碼去看實現方法。

但是URP內建的shader都是用HLSLPROGRAM和ENDHLSL來寫的,並且引用文件都是.hlsl。

和之前的CGPROGRAM,還有引用文件類型.cginc有所不同。

所以,如果想引用URP內建的方法和接口,必須得按照它們現在的方式來寫。

但經師傅指點,我看到了Unity官方的這一段話:

原來我們一直都是用HLSL來寫的shader,並非是cg語言,只是keywords和文件引用沒改成HLSL方式的。

所以我們要直接改成HLSL方式的shader還是比較友好的。

具體的操作方法是:

首先把我們的CGPROGRAM、ENDCG分別改成HLSLPROGRAM和ENDHLSL。

接着把#include "UnityCG.cginc"等文件引用改成

#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"這種方式,

具體要引用哪些文件,要自己去

Editor\Data\Resources\PackageManager\Editor\com.unity.render-pipelines.universal-7.3.1

目錄下,解壓包,看具體想引用哪個文件,再把相對路徑寫上去。

上面只是把cg的方式改成HLSL的方式,下面是具體實現urp的陰影方法:

首先,我看到了這一篇文章:

關於SHADOWS_SCREEN

要寫入 ShadowMap,shader必須有 ShadowCaster 這個Pass。

所以我在shader里加入了這一個pass:

pass {
			Tags{ "LightMode" = "ShadowCaster" }
			HLSLPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

			struct appdata
			{
				float4 vertex : POSITION;
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;

			v2f vert(appdata v)
			{
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
				return o;
			}
			float4 frag(v2f i) : SV_Target
			{
				float4 color;
				color.xyz = float3(0.0, 0.0, 0.0);
				return color;
			}
			ENDHLSL
		}

確實地面的投影就出現了(地面的shader是URP內建的Lit):

但物體上自己沒有陰影,是因爲原來的SHADOW_ATTENUATION失效了。

在URP的源代碼的upgrade-guide-7-2-0.md文檔裏,有提到這麼一段話:

我翻譯一下,就是如果有自定義的shader,想去採樣Shadermap貼圖,可以用舉例的方法:

float4 SHADOW_COORDS = TransformWorldToShadowCoord(i.worldPos);
Light mainLight = GetMainLight(SHADOW_COORDS);
half shadow = mainLight.shadowAttenuation;

要讓以上方法生效,必須定義以下的宏:

#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE

好,物體上的陰影也出現了。效果可以當然可以再調整下,畢竟

half shadow = mainLight.shadowAttenuation;只是個0-1的值,表現還是自己想辦法去做過渡之類的。

但是有個問題,這個陰影有鋸齒。具體如何解決呢,歡迎大家討論。我也會想辦法解決。

參考網址:

https://docs.unity3d.com/Packages/[email protected]/manual/upgrade-lwrp-to-urp.html

https://baddogzz.github.io/2019/12/19/URP-Shadow/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章