环境
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 R8G8B8A8_SRGB
渲染出来的话 LDR 色值
无论我们的自己如何设置 RT 的 graphicsFormat
来设置 HDR ,都是,都没有用的
比如下面我这设置的 RT graphicsFormat
是 R16G16B16A16_SFLOAT
(下面是 color format
,其实内部API中 color format
的 setter 是对 graphicsFormat
的设置,可以理解为同一个东西)
在 Frame Debug查看到,绘制使用的是: R8G8B8A8_SRGB
另外,我之前说过的 当前渲染 RT 被 偷梁换柱了,而我们原来的 RT 名字为: TestRT
,现在却变成 TempBuffer 2834 720x1280
,很明显就是换了另一个 RT
因此,如果你的项目中,某个 RT 想要拍摄 HDR 效果,并且有使用了 BRP 中的 PP 组件,那么 Camera.HDR == OFF 情况下,也是无法正常使用的 custom RT graphicsFormat
的 (其实这块功能设计就不是很好,难怪官方要放弃 BRP)
另外
- 如果 ProjectSettings/Graphics/[对应平台]/HDR mode设置为
R11G11B10
的话 - 并且 Camera.HDR 设置为
using graphics settings
那么你想要渲染到 custom RT 带 A 通道,是不行的
因为 R11G11B19_UFloatPack32
没有A通道,可以使用下面介绍的解决方法来处理
解决方法
RT camera 中不使用 BRP 自带的 PP 组件,自己写一个 PP 组件,可以参考以往我学习 Unity 后效组件来处理 : Unity Shader PostProcessing - 1 - 后处理概念文章来源:https://www.toymoban.com/news/detail-594507.html
项目中使用的话,使用的是 MonoBehaviour
的 OnRenderImage
,自行优化写法和部分效率问题文章来源地址https://www.toymoban.com/news/detail-594507.html
到了这里,关于Unity - BRP - PP后效导致 Camera.targetTexture 被换掉,graphicsFormat 不对问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!