您现在的位置是:首页 >技术交流 >Unity - BRP - PP后效导致 Camera.targetTexture 被换掉,graphicsFormat 不对问题网站首页技术交流

Unity - BRP - PP后效导致 Camera.targetTexture 被换掉,graphicsFormat 不对问题

Jave.Lin 2024-06-17 11:19:06
简介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 graphicsFormatR16G16B16A16_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 - 后处理概念

项目中使用的话,使用的是 MonoBehaviourOnRenderImage,自行优化写法和部分效率问题

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。