[譯]Unity – Camera’s Depth Texture

原文:Camera’s Depth Texture

在 Unity 裡的 camera 可以產生一個 depth 或 depth+normals texture。這是一個簡化的 G-buffer texture,可以用來做 post-processing effects 或去處理自訂的 lighting models(e.g. light pre-pass)。其實只要使用 Shader Replacement 就可以建造 camera 的 depth texture,所以那部分你完全可以自己做到,在這粒你需要一個不同的 G-buffer 設定。

Camera 的 depth texture 功能可以在 script 中使用 Camera.depthTextureMode 變數。

有兩個可用的 depth texture modes:

  • DepthTextureMode.Depth:一個 depth texture
  • DepthTextureMode.DepthNormals:depth 和 view space normals 會包裝在一個 texture裡。

DepthTextureMode.Depth texture

這個會創建一個等同螢幕大小的 depth texture

DepthTextureMode.DepthNormals texture

這個會創建一個等同螢幕大小的 32 bit(8 bit/channel)的 texture,view space normals 會被塞進 R&G channels,然後將 depth 塞進 B&A channels。Normals 會使用 Stereographic projection 編碼,然後 depth 是一個 16 bit 的值,分別塞進兩個 8 bit 的 channels。

UnityCG.cginc 的這個 Cg 引用檔案裡有一個協助用的 function “DecodeDepthNormal",用來解出編碼過的 pixel,取出 depth 和 normal 的值。回傳的 depth 會介於 0~1 之間。

如何使用 depth 和 normals texture的範例,請參考 Shader Replacement 範例裡面的 EdgeDetection image effect 或是 SSAO Image Effect

Tips & Tricks

在使用複雜的 shader 或 Image Effects 時,要隨時注意 Rendering Differences Between Platforms。尤其是在 Image Effect 裡面使用 depth texture 通常會要特別處裡 Direct3D + Antir-Aliasing。

在某些狀況,depth texture 可能會直接來自於 Z buffer。如果你在 depth texture 上看到奇怪的東西(瑕疵),請再次確認使用到depth texture 的 shader 在使用時是否有確實避免寫入 Z buffer(使用 ZWrite Off)。

Under the hood

Depth texture 根據被使用的 rendering path 和硬體,會有可能直接來自實際的 depth buffer,或是分在不同的 pass 中繪製。當 depth texture 被分在不同的 pass 繪製時,這時就要透過 Shader Replacement 完成。因此,在你的 shader 的 tag 裡,應該要有正確的 “RenderType" 就變得格外重要了!

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s