在URP中使用UICamera

有时候我们想要用单独一个相机来渲染UI。

1.内置管线

在内置渲染管线里,我们可以设一个主相机,再设一个UI相机。将UI相机的ClearFlags设为Depth Only,再设置相应的要渲染的层,即可将UI相机的图像叠加到主相机上(注意相机优先级)。

2.URP相机栈

但URP里的Camera没有clearFlags,改为了RenderType 。RenderType里只有base和overlay。
所以通常方法是利用相机栈来进行多个相机的叠加。
同内置渲染管线一样,我们可以设一个主相机,再设一个UI相机。将UI相机设置为overlay,再ui相机拖入主相机的相机栈中,设置好要渲染的层,即可将UI相机的图像叠加到主相机上(overlay相机没有优先级,如果有多个overlay相机的话,会按照相机栈从主相机依次顺序渲染相机栈中的每个相机)。
但这里有个问题,一旦设为overlay相机,就会丢掉很多可自定义的设置,比如相机渲染的画面在整个视图的比例(Viewport rest)。

3.URP相机里的BackgroundType

所以重点来了。其实在overlay里environment有个选背景的选项。天空盒和纯色自不用说,关键的是第三个Uninitialized(未初始化的)。在2020.1.0版本之前,设置这个基本和设置纯黑一样。
在这里插入图片描述
但是在我最近做的项目里,发现他们竟然能在urp里使用传统方法的UI相机(就是内置管线那套)。于是我研究了下,发现如果将版本升到到2020.2.1版本,urp版本到10.2.2以上。这时候ui相机即使是base的renderType,将BackgroundType设置为Uninitialized时,就能跟传统的UI相机效果一样了(同时就要注意优先级了)。
但是要注意,ui相机和主相机的HDR设置要一致,要么都是off,要么都是Use Pipline Setting,否则叠加的效果就会失效
改viewport rest依然绘失效。

之后又去文档翻下对Uninitialized这个选项的解释。
Does not initialize the color buffer. Choose this option only if your Camera or Camera Stack will draw to every pixel in the color buffer.
不初始化颜色缓冲区。只有当您的相机或相机堆栈将绘制到颜色缓冲中的每个像素时,才选择此选项。

不是很懂。但感觉unity这么悄咪咪地把这个depthOnly的功能加回来,估计还是有性能之类的顾虑,还是尽量用相机栈来做相机的叠加吧。
并没有加回来,本质好像还是overlay模式,泪目。。。

猜你喜欢

转载自blog.csdn.net/farcor_cn/article/details/116724384