复现环境:Unity 2021.3.16 SRP
在测试FXAA时发现一个挺恶心的bug,Unity Editor中渲染的CameraTarget的分辨率,和camera.pixelWidth并不相同,前者比后者少1。
这导致了这样的问题,因为_CameraColorAttachment是按照camera.pixelWidth的大小创建的,在渲染结束准备将_CameraColorAttachment写入到相机CameraTarget时,因为分辨率发生了变化会导致采样坐标发生缩放,如果刚好在这个步骤依赖之前的采样坐标(比如FXAA需要采样之前的贴图),就会产生误差。
这里给出了RenderDoc在写入到相机CameraTarget步骤前后的截图:
可以看到, 相机渲染最后一步时改变了分辨率。而这最后一步只是做了简单的复制,不可能会对分辨率造成影响。
之所以认为这是个bug,是因为Build后的项目是正常的,降分辨率的问题只在Editor中出现。
问题显然是Copy Color引起的,Editor正常情况下要做分辨率-1的操作,但因为我们提前降RenderTarget重定向到了_CameraColorAttachment,后面的渲染都按照没有-1的流程执行了。那么解决办法显然就有两种:
1. 修改_CameraColorAttachment的分辨率,手动让它减一,即camera.pixelWidth - 1
2. 保持_CameraColorAttachment的分辨率,将依赖采样坐标的操作独立出来执行,最后再执行一次单独的写回。
笔者使用的解法是2,因为项目中其他后处理颜色缓存都是用的camera.pixelWidth作为分辨率,1的改法代价比较高。相关修改可以用Editor的宏将相关修改包起来,不影响Build后的执行。