Unity – GrabPass 的重複使用

這是在使用 Unity 內建 Glass-Stained-BumpDistort 的這個 shader 時,多個物件使用時會讓 FPS 狂掉的問題。

推測是 grab pass 所造成的效能衝擊,本來嘗試先用一個空物件把 grab 的 texture 存下,之後用一般 texture 的方式傳給物件使用,來達成重複利用的方式。

結果最後沒搞定投影反轉的問題…幸好沒搞定(?)

繞了一大圈,回頭再看了一次官方文件,再看看 glass shader 後…

從原本的…

GrabPass {}

改為…

GrabPass  { "XXXXX" }

一行 code 就搞定這一切惹!! 就一行!

※剛才特地開了一個新專案匯入,已經解掉了=3= (還是當初被我誤刪?)

順路翻譯:

ShaderLab syntax: GrabPass

語法 (Syntax)

GrabPass 是一個特殊的 passtype – 它會擷取該物件將要被繪製的螢幕上的資訊(it grabs the contents of the screen where the object is about to be drawn into a texture)。這個 texture 可被隨後的 passes 使用於基於圖像的進階特效。

GrabPass 所屬於 subshader 裡面。它可以有兩種形式:

  • Just GrabPass { } 將會把目前的螢幕資訊存入 texture 內。這個貼圖可以進一步使用 _GrabTexture 這個名稱來存取。注意:這個形式的 grab pass 將會為每一個物件執行一次高消耗的操作。
  • GrabPass { “TextureName" } 也同樣會把螢幕資訊存入 texture 內,但是每幀只有第一個使用到該名稱的物件會進行擷取。這是一個當你有多個物件會在場景中使用 grab pass 時的一個高效能做法

另外,GrabPass 可以使用 NameTags 指令。

Example

這是一個高消耗的方式,來反轉之前被繪製顏色:

Shader "GrabPassInvert" {
    SubShader {
        // Draw ourselves after all opaque geometry
        Tags { "Queue" = "Transparent" }

        // Grab the screen behind the object into _GrabTexture
        GrabPass { }

        // Render the object with the texture generated above, and invert it's colors
        Pass {
            SetTexture [_GrabTexture] { combine one-texture }
        }
    }
}

這個 shader 有兩個 passes:第一個 pass 會擷取任何在繪製時位在物件後方的東西,然後將之帶進第二個 pass。當然,也可以使用改變 blend mode 這樣低消耗的方式來達成同樣的效果。

其他參考

Regular Pass 指令

Page last updated: 2012-07-10

發表迴響

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

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