[程式] Unity post processing stack問題

看板GameDesign (遊戲設計)作者 (苦味)時間7年前 (2017/09/08 05:37), 7年前編輯推噓18(18058)
留言76則, 3人參與, 最新討論串1/1
最近正在作一些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 我查過很久資料都找不太到解答, 希望有經驗的人能提點一下, 感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 24.210.62.187 ※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1504820260.A.6AC.html ※ 編輯: Ninja5566 (24.210.62.187), 09/08/2017 05:38:34

09/08 05:42, , 1F
想了一下似乎有暴力解, 只要把cameraA再render到
09/08 05:42, 1F

09/08 05:43, , 2F
一個render texture,然後再用另外一個cameraC來結合
09/08 05:43, 2F

09/08 05:43, , 3F
但還是滿麻煩的
09/08 05:43, 3F

09/08 05:58, , 4F
這個限制感覺是跟內部實作有關,如果內部運作是把
09/08 05:58, 4F

09/08 05:59, , 5F
繪製render texture的作業平行處理,那不能有依賴姓
09/08 05:59, 5F

09/08 06:00, , 6F
是合理的,這樣就必須多一個pass
09/08 06:00, 6F

09/08 06:00, , 7F
不過我跟PP Stack不熟,搞不好有其他解
09/08 06:00, 7F

09/08 06:03, , 8F
其實也不一定要pp stack, 只要免費而且有一定品質的
09/08 06:03, 8F

09/08 06:03, , 9F
PP 插件我都不會排斥
09/08 06:03, 9F

09/08 06:25, , 10F
特殊使用需求常常會碰壁,因為自己的需求自己最清楚
09/08 06:25, 10F

09/08 06:26, , 11F
其實遇到這種情況我會傾向於自己寫
09/08 06:26, 11F

09/08 06:28, , 12F
是否能提供效果node示意圖或期望結果?
09/08 06:28, 12F

09/08 06:28, , 13F
或許有其他做法也不一定
09/08 06:28, 13F

09/08 06:32, , 14F
咦?RenderTexture是繼承自Texture不是?
09/08 06:32, 14F

09/08 06:32, , 15F
怎麼可以收Texture的功能卻不收RenderTexture?
09/08 06:32, 15F

09/08 06:56, , 16F
應該是說我的猜測是PP stack會強迫camera寫到screen
09/08 06:56, 16F
如果我cameraA不放PP script, cameraB有放 會變成螢幕強迫輸出cameraB的畫面, 並且有PP 不過我是不知道你說"收texture功能"是甚麼意思 ※ 編輯: Ninja5566 (24.210.62.187), 09/08/2017 06:57:49 我不自己寫的原因是因為..我不可能自己把PP stack裡面所有效果自己做出來 ※ 編輯: Ninja5566 (24.210.62.187), 09/08/2017 06:58:54

09/08 07:14, , 17F
啊,我現在才看懂RenderTexture無法"套用"PP的意思
09/08 07:14, 17F

09/08 07:14, , 18F
你是說cameraA可以繪製,沒有出任何錯誤,但就是來自
09/08 07:14, 18F

09/08 07:15, , 19F
cameraB的RenderTexture的那一半沒有PP效果?
09/08 07:15, 19F

09/08 07:16, , 20F
搞不好是PP需要g-buffer,blit只有複製color buffer
09/08 07:16, 20F

09/08 07:16, , 21F
你實際使用的PP有哪些?
09/08 07:16, 21F

09/08 07:35, , 22F
我目前使用forward rendering, 因為blit似乎沒法
09/08 07:35, 22F

09/08 07:35, , 23F
在deferred下使用, 我也不知道為什麼
09/08 07:35, 23F

09/08 07:36, , 24F
AO, motion blur, vignetee, fog, SSR,
09/08 07:36, 24F

09/08 07:49, , 25F
那就對了,AO, motion blur, fog, SSR需要g-buffer
09/08 07:49, 25F

09/08 07:49, , 26F
blit只是附製color buffer,資訊不夠PP使用
09/08 07:49, 26F

09/08 07:51, , 27F
需要找到能夠把g-buffer一併餵進用PP的camera的方法
09/08 07:51, 27F

09/08 07:51, , 28F
這個我就不熟了,需要另外研究
09/08 07:51, 28F
應該說目前有兩個效果, 兩個script 1.我自己的image effect script 2.PP behavior script 兩者都是依賴OnRenderImage 這個function 運作 1只是做我前面講的把兩個texture結合再一起的事情而已 2也是會自己call blit 在他自己script裡面 所以pp script並沒有所謂不能blit的問題(我覺得) 有可能需要綁buffer是真的 但是script裡面的public function都沒有任何東西可以讓我設定 這就是最麻煩的地方 ※ 編輯: Ninja5566 (24.210.62.187), 09/08/2017 08:04:35

09/08 07:57, , 29F
AO需要深度和法向量資訊,motion blur需要速度資訊
09/08 07:57, 29F

09/08 07:58, , 30F
fog需要深度資訊,SSR需要深度和法向量資訊
09/08 07:58, 30F

09/08 08:05, , 31F
沒錯, 但是我現在是預設forward rendering, 理論上沒
09/08 08:05, 31F

09/08 08:05, , 32F
gbuffer吧
09/08 08:05, 32F

09/08 08:18, , 33F
我把zbuffer不小心歸到gbuffer了,然後我猜(未驗證)
09/08 08:18, 33F

09/08 08:18, , 34F
Unity偵測到你要用那些需要gbuffer的PP,還是會開
09/08 08:18, 34F

09/08 08:19, , 35F
gbuffer,不然效果根本算不出來,forward rendering也
09/08 08:19, 35F

09/08 08:19, , 36F
跟gbuffer不互斥,就是多了幾個render target這樣
09/08 08:19, 36F

09/08 08:22, , 37F
forward rendering只是把最終顏色計算用一個pass搞定
09/08 08:22, 37F

09/08 08:23, , 38F
需要的gbuffer還是可以照樣生成,Unity有沒有提供相關
09/08 08:23, 38F

09/08 08:23, , 39F
資料流向控制API我就不清楚了
09/08 08:23, 39F

09/08 08:40, , 40F
PP script public function沒可設定的地方的確很麻煩..
09/08 08:40, 40F

09/08 08:41, , 41F
研究了一下PP stack的資源,看來除非官方有意改進
09/08 08:41, 41F

09/08 08:41, , 42F
否則看起來不樂觀...
09/08 08:41, 42F

09/08 09:03, , 43F
在GitHub上面找到PP Stack http://bit.ly/2j9Kowy
09/08 09:03, 43F

09/08 09:04, , 44F
如果急需的話應該可以想辦法加個自訂camera feed屬性
09/08 09:04, 44F

09/08 09:04, , 45F
然後在PopulateCommandBuffer抓gbuffer餵入流程
09/08 09:04, 45F
lol 結果是我只要把component順序顛倒就好了 原本是image effect在pp後面, 把他對調就會改變onRenderimage的順序 不過還是感謝回答 ※ 編輯: Ninja5566 (24.210.62.187), 09/08/2017 09:23:34

09/08 09:25, , 46F
咧,這樣竟然有用? 很好奇gbuffer到底是怎麼傳過去的
09/08 09:25, 46F

09/08 09:26, , 47F
不然無法想像那些需要gbuffer的PP怎麼運算
09/08 09:26, 47F

09/08 09:26, , 48F
不管怎樣,可喜可賀!
09/08 09:26, 48F
我猜應該不需要, 因為這時候會變成先把兩者texture結合 再去做PP, 自然就不會有這煩惱了 ※ 編輯: Ninja5566 (24.210.62.187), 09/08/2017 09:32:35

09/08 09:43, , 49F
我的疑惑是,是否在blit RenderTexture的時候也包含
09/08 09:43, 49F

09/08 09:43, , 50F
相關的gbuffer,如果是的話,那就說得通了
09/08 09:43, 50F

09/08 09:44, , 51F
只是我又好奇這種隱藏的額外資料流,是否是偵測到有需
09/08 09:44, 51F

09/08 09:45, , 52F
求才啟用,不然平常沒有需求會浪費運算資源
09/08 09:45, 52F

09/08 09:45, , 53F
有空再去挖挖Unity的source看看好了,sorry囉嗦了
09/08 09:45, 53F

09/08 17:22, , 54F
我覺得 Blit 應該沒那麼多功能...
09/08 17:22, 54F

09/08 17:23, , 55F
blit寫gbuffer可以用CommandBuffer
09/08 17:23, 55F

09/08 17:24, , 56F
但是也是一次寫一個 buffer 而已
09/08 17:24, 56F

09/08 17:30, , 57F
而且不用 deferred 應該是沒辦法作 SSR 才對啊?
09/08 17:30, 57F
我只是嘗試把我想要的功能全開而已, SSR有沒有真的使用到 我不是很確定, 但一旦我開deferred就發現我的image effect會很詭異 cameraB的RT就會變只能抓開頭的一張 ※ 編輯: Ninja5566 (24.210.62.187), 09/08/2017 20:58:06 ※ 編輯: Ninja5566 (24.210.62.187), 09/08/2017 21:00:42 更正: 後來我發現只要把cameraA改deferred, B改forward就可以正常使用了 ※ 編輯: Ninja5566 (24.210.62.187), 09/08/2017 21:06:34

09/09 00:59, , 58F
哈,我也想說blit應該沒有那麼花俏,感覺是要自己
09/09 00:59, 58F

09/09 01:00, , 59F
寫command buffer複製gbuffer才對,不過我就是好奇只用
09/09 01:00, 59F

09/09 01:00, , 60F
一個blit是怎麼讓最終camera可以有足夠資訊把來自兩個
09/09 01:00, 60F

09/09 01:00, , 61F
不同camera的場景正確套用需要gbuffer的效果
09/09 01:00, 61F

09/09 01:51, , 62F
原Po的後製特效問題已藉由調整順序解決
09/09 01:51, 62F

09/09 01:51, , 63F
所以 RenderTexture 直接就是加好後製的樣子
09/09 01:51, 63F

09/09 01:52, , 64F
畫到main camera上有沒有gbuffer好像也沒差了 (猜)
09/09 01:52, 64F

09/09 01:53, , 65F
另外我有嘗試一下Po說的共存問題
09/09 01:53, 65F

09/09 01:54, , 66F
好像放在PP後執行的後製處理都會讓PP效果失效
09/09 01:54, 66F

09/09 01:55, , 67F
但是如果在自己元件的 OnRenderImage 函式前
09/09 01:55, 67F

09/09 01:55, , 68F
加上 [ImageEffectOpaque] 標籤就可以無視順序
09/09 01:55, 68F

09/09 01:56, , 69F
只是我不知道有沒有其他副作用 XD
09/09 01:56, 69F

09/09 02:03, , 70F
啊...好像沒有失效的樣子,是我搞錯了...Sorry Orz
09/09 02:03, 70F

09/09 02:15, , 71F
補一下測試的圖 https://i.imgur.com/dvEcxMc.png
09/09 02:15, 71F

09/09 08:29, , 72F
所以你的主畫面還有RT 都有PP? 請問你有特別設定
09/09 08:29, 72F

09/09 08:29, , 73F
gbuffer嗎?
09/09 08:29, 73F

09/09 21:33, , 74F
恩,我是兩邊都設PP,沒設定gbuffer
09/09 21:33, 74F

09/09 21:34, , 75F
這方法的問題就是會跑兩次後製處理
09/09 21:34, 75F

09/09 21:40, , 76F
上圖是直接確認RenderTexture是否有更新這樣
09/09 21:40, 76F
文章代碼(AID): #1PiRmaQi (GameDesign)
文章代碼(AID): #1PiRmaQi (GameDesign)