作者Ninja5566 (苦味)
看板GameDesign
标题[程式] Unity post processing stack问题
时间Fri Sep 8 05:37:38 2017
最近正在作一些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://webptt.com/cn.aspx?n=bbs/GameDesign/M.1504820260.A.6AC.html
※ 编辑: Ninja5566 (24.210.62.187), 09/08/2017 05:38:34
1F:→ Ninja5566: 想了一下似乎有暴力解, 只要把cameraA再render到 09/08 05:42
2F:→ Ninja5566: 一个render texture,然後再用另外一个cameraC来结合 09/08 05:43
3F:→ Ninja5566: 但还是满麻烦的 09/08 05:43
4F:推 cjcat2266: 这个限制感觉是跟内部实作有关,如果内部运作是把 09/08 05:58
5F:→ cjcat2266: 绘制render texture的作业平行处理,那不能有依赖姓 09/08 05:59
6F:→ cjcat2266: 是合理的,这样就必须多一个pass 09/08 06:00
7F:→ cjcat2266: 不过我跟PP Stack不熟,搞不好有其他解 09/08 06:00
8F:→ Ninja5566: 其实也不一定要pp stack, 只要免费而且有一定品质的 09/08 06:03
9F:→ Ninja5566: PP 插件我都不会排斥 09/08 06:03
10F:推 cjcat2266: 特殊使用需求常常会碰壁,因为自己的需求自己最清楚 09/08 06:25
11F:→ cjcat2266: 其实遇到这种情况我会倾向於自己写 09/08 06:26
12F:推 cjcat2266: 是否能提供效果node示意图或期望结果? 09/08 06:28
13F:→ cjcat2266: 或许有其他做法也不一定 09/08 06:28
14F:推 cjcat2266: 咦?RenderTexture是继承自Texture不是? 09/08 06:32
15F:→ cjcat2266: 怎麽可以收Texture的功能却不收RenderTexture? 09/08 06:32
16F:→ 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
17F:推 cjcat2266: 啊,我现在才看懂RenderTexture无法"套用"PP的意思 09/08 07:14
18F:→ cjcat2266: 你是说cameraA可以绘制,没有出任何错误,但就是来自 09/08 07:14
19F:→ cjcat2266: cameraB的RenderTexture的那一半没有PP效果? 09/08 07:15
20F:→ cjcat2266: 搞不好是PP需要g-buffer,blit只有复制color buffer 09/08 07:16
21F:→ cjcat2266: 你实际使用的PP有哪些? 09/08 07:16
22F:→ Ninja5566: 我目前使用forward rendering, 因为blit似乎没法 09/08 07:35
23F:→ Ninja5566: 在deferred下使用, 我也不知道为什麽 09/08 07:35
24F:→ Ninja5566: AO, motion blur, vignetee, fog, SSR, 09/08 07:36
25F:推 cjcat2266: 那就对了,AO, motion blur, fog, SSR需要g-buffer 09/08 07:49
26F:→ cjcat2266: blit只是附制color buffer,资讯不够PP使用 09/08 07:49
27F:→ cjcat2266: 需要找到能够把g-buffer一并喂进用PP的camera的方法 09/08 07:51
28F:→ 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
29F:推 cjcat2266: AO需要深度和法向量资讯,motion blur需要速度资讯 09/08 07:57
30F:→ cjcat2266: fog需要深度资讯,SSR需要深度和法向量资讯 09/08 07:58
31F:→ Ninja5566: 没错, 但是我现在是预设forward rendering, 理论上没 09/08 08:05
32F:→ Ninja5566: gbuffer吧 09/08 08:05
33F:推 cjcat2266: 我把zbuffer不小心归到gbuffer了,然後我猜(未验证) 09/08 08:18
34F:→ cjcat2266: Unity侦测到你要用那些需要gbuffer的PP,还是会开 09/08 08:18
35F:→ cjcat2266: gbuffer,不然效果根本算不出来,forward rendering也 09/08 08:19
36F:→ cjcat2266: 跟gbuffer不互斥,就是多了几个render target这样 09/08 08:19
37F:推 cjcat2266: forward rendering只是把最终颜色计算用一个pass搞定 09/08 08:22
38F:→ cjcat2266: 需要的gbuffer还是可以照样生成,Unity有没有提供相关 09/08 08:23
39F:→ cjcat2266: 资料流向控制API我就不清楚了 09/08 08:23
40F:推 cjcat2266: PP script public function没可设定的地方的确很麻烦.. 09/08 08:40
41F:→ cjcat2266: 研究了一下PP stack的资源,看来除非官方有意改进 09/08 08:41
42F:→ cjcat2266: 否则看起来不乐观... 09/08 08:41
44F:→ cjcat2266: 如果急需的话应该可以想办法加个自订camera feed属性 09/08 09:04
45F:→ cjcat2266: 然後在PopulateCommandBuffer抓gbuffer喂入流程 09/08 09:04
lol 结果是我只要把component顺序颠倒就好了
原本是image effect在pp後面, 把他对调就会改变onRenderimage的顺序
不过还是感谢回答
※ 编辑: Ninja5566 (24.210.62.187), 09/08/2017 09:23:34
46F:推 cjcat2266: 咧,这样竟然有用? 很好奇gbuffer到底是怎麽传过去的 09/08 09:25
47F:→ cjcat2266: 不然无法想像那些需要gbuffer的PP怎麽运算 09/08 09:26
48F:→ cjcat2266: 不管怎样,可喜可贺! 09/08 09:26
我猜应该不需要, 因为这时候会变成先把两者texture结合
再去做PP, 自然就不会有这烦恼了
※ 编辑: Ninja5566 (24.210.62.187), 09/08/2017 09:32:35
49F:推 cjcat2266: 我的疑惑是,是否在blit RenderTexture的时候也包含 09/08 09:43
50F:→ cjcat2266: 相关的gbuffer,如果是的话,那就说得通了 09/08 09:43
51F:→ cjcat2266: 只是我又好奇这种隐藏的额外资料流,是否是侦测到有需 09/08 09:44
52F:→ cjcat2266: 求才启用,不然平常没有需求会浪费运算资源 09/08 09:45
53F:→ cjcat2266: 有空再去挖挖Unity的source看看好了,sorry罗嗦了 09/08 09:45
54F:推 chowleft: 我觉得 Blit 应该没那麽多功能... 09/08 17:22
55F:→ chowleft: blit写gbuffer可以用CommandBuffer 09/08 17:23
56F:→ chowleft: 但是也是一次写一个 buffer 而已 09/08 17:24
57F:→ 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
58F:推 cjcat2266: 哈,我也想说blit应该没有那麽花俏,感觉是要自己 09/09 00:59
59F:→ cjcat2266: 写command buffer复制gbuffer才对,不过我就是好奇只用 09/09 01:00
60F:→ cjcat2266: 一个blit是怎麽让最终camera可以有足够资讯把来自两个 09/09 01:00
61F:→ cjcat2266: 不同camera的场景正确套用需要gbuffer的效果 09/09 01:00
62F:推 chowleft: 原Po的後制特效问题已藉由调整顺序解决 09/09 01:51
63F:→ chowleft: 所以 RenderTexture 直接就是加好後制的样子 09/09 01:51
64F:→ chowleft: 画到main camera上有没有gbuffer好像也没差了 (猜) 09/09 01:52
65F:→ chowleft: 另外我有尝试一下Po说的共存问题 09/09 01:53
66F:→ chowleft: 好像放在PP後执行的後制处理都会让PP效果失效 09/09 01:54
67F:→ chowleft: 但是如果在自己元件的 OnRenderImage 函式前 09/09 01:55
68F:→ chowleft: 加上 [ImageEffectOpaque] 标签就可以无视顺序 09/09 01:55
69F:→ chowleft: 只是我不知道有没有其他副作用 XD 09/09 01:56
70F:→ chowleft: 啊...好像没有失效的样子,是我搞错了...Sorry Orz 09/09 02:03
72F:→ Ninja5566: 所以你的主画面还有RT 都有PP? 请问你有特别设定 09/09 08:29
73F:→ Ninja5566: gbuffer吗? 09/09 08:29
74F:推 chowleft: 恩,我是两边都设PP,没设定gbuffer 09/09 21:33
75F:→ chowleft: 这方法的问题就是会跑两次後制处理 09/09 21:34
76F:→ chowleft: 上图是直接确认RenderTexture是否有更新这样 09/09 21:40