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