[程式] 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