發表文章

目前顯示的是 11月, 2020的文章

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, tru...