[程式] Unity post processing stack問題

作者: Ninja5566 (苦味)   2017-09-08 05:37:38
最近正在作一些shader, 但是在和post processing stack
這個插件結合的時候遇到一些問題, 希望有人能幫忙解惑
在場景裡面有兩個camera, cameraA, cameraB
cameraA為主要camera, 負責輸出最終影像
cameraB則是render 到一個render texture中
而cameraA 有一個我自己做的image effect, 用途是把main texture
的畫面和 render texture去做結合
所以cameraA 中有個script就是專門call Graphics.Blit
至於image effect細節為何就暫時跳過, 但是可以想成
畫面結合方式是螢幕左半邊採用main texture, 右半邊是render texture
現在問題來了, 當我想要使用post processing stack美化最終畫面
會出現很麻煩的事情, 就是render texture 沒辦法套用post process (PP)
所以會變成左半邊有PP, 右半邊沒有
如果我強迫兩個camera都加進PP script, 會造成image effect失效
變成有PP, 但無法結合兩個texture
我查過很久資料都找不太到解答, 希望有經驗的人能提點一下, 感謝!
作者: Ninja5566 (苦味)   2017-09-08 05:42:00
想了一下似乎有暴力解, 只要把cameraA再render到一個render texture,然後再用另外一個cameraC來結合但還是滿麻煩的
作者: cjcat2266 (CJ Cat)   2017-09-08 05:58:00
這個限制感覺是跟內部實作有關,如果內部運作是把繪製render texture的作業平行處理,那不能有依賴姓是合理的,這樣就必須多一個pass不過我跟PP Stack不熟,搞不好有其他解
作者: Ninja5566 (苦味)   2017-09-08 06:03:00
其實也不一定要pp stack, 只要免費而且有一定品質的PP 插件我都不會排斥
作者: cjcat2266 (CJ Cat)   2017-09-08 06:25:00
特殊使用需求常常會碰壁,因為自己的需求自己最清楚其實遇到這種情況我會傾向於自己寫是否能提供效果node示意圖或期望結果?或許有其他做法也不一定咦?RenderTexture是繼承自Texture不是?怎麼可以收Texture的功能卻不收RenderTexture?
作者: Ninja5566 (苦味)   2017-09-08 06:56:00
應該是說我的猜測是PP stack會強迫camera寫到screen
作者: cjcat2266 (CJ Cat)   2017-09-08 07:14:00
啊,我現在才看懂RenderTexture無法"套用"PP的意思你是說cameraA可以繪製,沒有出任何錯誤,但就是來自cameraB的RenderTexture的那一半沒有PP效果?搞不好是PP需要g-buffer,blit只有複製color buffer你實際使用的PP有哪些?
作者: Ninja5566 (苦味)   2017-09-08 07:35:00
我目前使用forward rendering, 因為blit似乎沒法在deferred下使用, 我也不知道為什麼AO, motion blur, vignetee, fog, SSR,
作者: cjcat2266 (CJ Cat)   2017-09-08 07:49:00
那就對了,AO, motion blur, fog, SSR需要g-bufferblit只是附製color buffer,資訊不夠PP使用需要找到能夠把g-buffer一併餵進用PP的camera的方法這個我就不熟了,需要另外研究AO需要深度和法向量資訊,motion blur需要速度資訊fog需要深度資訊,SSR需要深度和法向量資訊
作者: Ninja5566 (苦味)   2017-09-08 08:05:00
沒錯, 但是我現在是預設forward rendering, 理論上沒gbuffer吧
作者: cjcat2266 (CJ Cat)   2017-09-08 08:18:00
我把zbuffer不小心歸到gbuffer了,然後我猜(未驗證)Unity偵測到你要用那些需要gbuffer的PP,還是會開gbuffer,不然效果根本算不出來,forward rendering也跟gbuffer不互斥,就是多了幾個render target這樣forward rendering只是把最終顏色計算用一個pass搞定需要的gbuffer還是可以照樣生成,Unity有沒有提供相關資料流向控制API我就不清楚了PP script public function沒可設定的地方的確很麻煩..研究了一下PP stack的資源,看來除非官方有意改進否則看起來不樂觀...在GitHub上面找到PP Stack http://bit.ly/2j9Kowy如果急需的話應該可以想辦法加個自訂camera feed屬性然後在PopulateCommandBuffer抓gbuffer餵入流程咧,這樣竟然有用? 很好奇gbuffer到底是怎麼傳過去的不然無法想像那些需要gbuffer的PP怎麼運算不管怎樣,可喜可賀!我的疑惑是,是否在blit RenderTexture的時候也包含相關的gbuffer,如果是的話,那就說得通了只是我又好奇這種隱藏的額外資料流,是否是偵測到有需求才啟用,不然平常沒有需求會浪費運算資源有空再去挖挖Unity的source看看好了,sorry囉嗦了
作者: chowleft (什麼....)   2017-09-08 17:22:00
我覺得 Blit 應該沒那麼多功能...blit寫gbuffer可以用CommandBuffer但是也是一次寫一個 buffer 而已而且不用 deferred 應該是沒辦法作 SSR 才對啊?
作者: cjcat2266 (CJ Cat)   2017-09-09 00:59:00
哈,我也想說blit應該沒有那麼花俏,感覺是要自己寫command buffer複製gbuffer才對,不過我就是好奇只用一個blit是怎麼讓最終camera可以有足夠資訊把來自兩個不同camera的場景正確套用需要gbuffer的效果
作者: chowleft (什麼....)   2017-09-09 01:51:00
原Po的後製特效問題已藉由調整順序解決所以 RenderTexture 直接就是加好後製的樣子畫到main camera上有沒有gbuffer好像也沒差了 (猜)另外我有嘗試一下Po說的共存問題好像放在PP後執行的後製處理都會讓PP效果失效但是如果在自己元件的 OnRenderImage 函式前加上 [ImageEffectOpaque] 標籤就可以無視順序只是我不知道有沒有其他副作用 XD啊...好像沒有失效的樣子,是我搞錯了...Sorry Orz補一下測試的圖 https://i.imgur.com/dvEcxMc.png
作者: Ninja5566 (苦味)   2017-09-09 08:29:00
所以你的主畫面還有RT 都有PP? 請問你有特別設定gbuffer嗎?
作者: chowleft (什麼....)   2017-09-09 21:33:00
恩,我是兩邊都設PP,沒設定gbuffer這方法的問題就是會跑兩次後製處理上圖是直接確認RenderTexture是否有更新這樣

Links booklink

Contact Us: admin [ a t ] ucptt.com