Depth Texture To World Position
這篇來稍微實作一下深度圖的應用效果。 深度圖當中的數值介於 0~1 之間,精度通常為 32 or 16 bits,而且是非線性分佈,因此往往會需要再取到深度之後再轉一次成為線性的過程才比較方便後續使用。 這次的效果是在 Unity 內建渲染管線 (Built-in Render Pipeline)上製作。 一般來說要開啟深度圖可已在代碼當中加上 Camera.main.depthTextureMode = DepthTextureMode.Depth; 來讓攝影機取得深度圖資訊。 而這次是在 PostProcessing 效果上製作,因次需要在後製的 class 上加上 DepthTextureMode GetCameraFlags() 來讓攝影機開啟取得深度圖。 在開啟深度圖之後,所有的不透明物件(Opaque)都會多計算一次 Pass 來取得深度資訊(Z-Pre Pass)。如果有性能考量,須留意 DrawCall 是否增長過多。 如果是在URP環境,就可以使用 CopyDepth 的方式來取得不透明物件(Opaque)的深度圖。 再來便是在 void Render(PostProcessRenderContext context) 內執行相關的 shader 以及參數的設置。 由於我們希望從深度圖轉出世界座標,因此必須給予shader正確的 攝影機矩陣(Matrix4x4)資訊(傳遞目前的VP逆矩陣)。 最後則可以用後製shader得到的世界座標來做出貼地板的掃光效果。 References: https://ompuco.wordpress.com/2018/03/21/9/ https://www.jianshu.com/p/80a932d1f11e https://assetstore.unity.com/packages/3d/environments/landscapes/free-island-collection-104753 https://assetstore.unity.com/packages/3d/props/exterior/rock-and-boulders-2-6947