您现在的位置是:首页 >技术交流 >Unity - BRP - PP后效导致 Camera.targetTexture 被换掉,graphicsFormat 不对问题网站首页技术交流
Unity - BRP - PP后效导致 Camera.targetTexture 被换掉,graphicsFormat 不对问题
环境
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,自行优化写法和部分效率问题





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结