Unity:URP的獲取光照節點


 

最近想要在URP用Shader Graph的Unlit節點上使用自定義的光照,所以要取得場景的光照資訊,Unity官方是有提供獲取方向光以及多重光源的光照資訊的方式

問題就來了,新版的URP似乎沒有辦法照上面官方文章裡提到的方式獲取陰影,這個問題是出在獲取陰影的功能實際上要定義特定的指示詞才能計算陰影,如果沒有定義會變成不計算陰影。

翻了網路上的文章已經有人對此問題做出詳細說明,可見此。要獲取光照的陰影就需要把原先計算陰影的程式碼複製過來,直接在自定義的節點裡執行計算,在文章裡其實已經有完成品了,不過只有主光源,那麼如果要處理多重光源(這邊指的是除了主光源以外的Additional Lights)怎麼辦呢?

 其實Unity官方的文章已經有說明了獲取多重光源的光照資訊,有一點問題就是沒告訴你怎麼取得陰影,如果照舊版URP,應該是跟獲取主光源陰影一樣的方法,陰影的值應該封裝在燈光的struct裡,同樣的在新版的URP也無法作用。

所以如果要在新版的URP獲取多重光源的陰影的做法與取得主光源的陰影是相近的,差異在多重光源獲取陰影要在獲取光照資訊裡的迴圈執行。同樣的,需要將世界座標轉換到陰影空間的座標,取得陰影的相關參數,並在ShadowMap採樣陰影。計算各個光源的光照強度與顏色(attenuatedLightColor)會變成如下:


half4 shadowCoord = mul(_AdditionalLightsWorldToShadow[i], float4(WorldPosition, 1.0f));
half4 shadowParams = GetAdditionalLightShadowParams(i);
ShadowSamplingData shadowSamplingData = GetAdditionalLightShadowSamplingData();
float shadowAtten = SampleShadowmap(TEXTURE2D_ARGS(_AdditionalLightsShadowmapTexture, sampler_AdditionalLightsShadowmapTexture), shadowCoord, shadowSamplingData, shadowParams, true);
       
half3 attenuatedLightColor = light.color * light.distanceAttenuation * shadowAtten;

不過還是有一點需要提到,Unity官方文章裡計算光照的做法是沒有考慮能量守恆的,所以會與Lit Shader的結果不太一樣,而近似於Simple Lit Shader。

如果要考慮物理正確和能量守恆可以看Light.hlsl中PBR光照的做法。



留言

這個網誌中的熱門文章

Unity:嘗試製作可相交的視差遮蔽貼圖Shader (Parallax Occlusion Mapping Shader with Pixel Depth Offset)

Blender:Geometry Node 應用於營造法式生成大木作構件初探-梭柱篇

Blender:Geometry Node 應用於營造法式生成大木作構件初探-卷殺折線標準化篇