文章目录
- 环境
- 目的
- 原因
- 问题
- 解决方法
环境
Unity : 国际版2020.3.37f1
Pipeline : BRP
Packages: Post Processing 3.0.3
目的
BRP 虽然是 官方放弃更新的 渲染管线,但是有些项目仍然会使用到,有一些踩过的坑,该记录的还是记录一下,便于 自己、他人 索引
原因
为了保留 HDR 效果,并且为了做性能优化
我们让 FrameBuffer 里面的 Color Buffer 使用格式为 R11G11B10 (注意没有A通道)
而没有使用 FP16,毕竟 FP16 会比 R11G11B10 大 2 倍 内存
问题
另外
我们在 Camera 渲染到 RT 时,Camera.HDR
设置为 Off
或是 Using Graphics Settings
FrameDebugger 都可以看到渲染使用都是 RT 中制定的 graphicsFormat
(这里是设置 R16G16B16A16_SFloat
为例)
这时,如果我们使用 Post-process Layer 和 Post-process Volume 组件,就会导致 Camera.TargetTexture
被偷梁换柱,如下图
这种的话,RT 渲染出来的话,无论我们的RT graphicsFormat 是否 HDR 的,都没有用
我们的 RT graphicsFormat
是 R16G16B16A16_SFLOAT
(下面是 color format
,其实内部API中 color format 的 setter 是对 graphicsFormat
的设置)
但是绘制使用的竟然是: R8G8B8A8_SRGB
这就没办法整 HDR 了
另外,我之前说过的 当前渲染 RT 被 偷梁换柱了,而我们原来的 RT 名字为: TestRT
因此,如果你的项目中,某个 RT 想要拍摄 HDR 效果,并且有使用了 BRP 中的 PP 组件,那么 Camera.HDR == OFF 情况下,是无法正常使用的 custom RT 的 (其实这块功能设计就不是很好,难怪官方要放弃 BRP)
另外,如果你的 custom RT 如果是带了 A 通道,但是渲染出来的 RT,被 using graphics settings 替换了,可能会使用 R11G11B19_UFloatPack32
导致没有透明通道,都可以使用下面介绍的解决方法来处理
解决方法
RT camera 中不使用 BRP 自带的 PP 组件,自己写一个 PP 组件,可以参考以往我学习 Unity 后效组件来处理 : Unity Shader PostProcessing - 1 - 后处理概念
项目中使用的话,使用的是 MonoBehaviour
的 OnRenderImage
,自行优化写法和部分效率问题