大家好,我是阿赵,这里继续讲一下URP渲染管线。
这次要讲的是URP渲染管线里面的摄像机用法
之前介绍过,URP摄像机和普通摄像机的属性显示上有比较大的变化:
接下来从用法上来说明一下:
1、多个摄像机的处理变化
多个URP摄像机同时存在时,不再是通过depth来给摄像机渲染排序
从摄像机的设置里面可以看到RenderType分成了2种类型:
1.Base
2.OverLay
如果创建一个摄像机并且把RenderType设置成Overlay,会发现摄像机的选项里面会少了很多东西。
调几个主要的说一下:
1.Overlay类型的摄像机不能设置抗锯齿
2.Overlay类型的摄像机多了一个ClearDepth的选项,但没有了OpaqueTexture和DepthTexture的选项
3.Base类型的摄像机可以指定BackgroundType,也就是背景类型,比如天空盒或者纯色之类的,Overlay类型的摄像机是不可以指定背景类型的
4.Base类型的摄像机可以指定OutputTexture,也就是输出的RenderTexture,Overlay类型的摄像机是不可单独指定输出RenderTexture
接下来我们保持主摄像机MainCamera为Base类型,然后再创建了cam1和cam2作为Overlay类型的摄像机
虽然有3个摄像机,但从Game视图只看到一个摄像机。
这是因为,一组摄像机里面,只能有一个Base类型,然后多个Overlay类型的摄像机要在Base摄像机的Stack里面添加并指定顺序,才能渲染出来
从上面的情况可以看出,Base类型的摄像机是最先渲染的,所以在最下层,然后再到Stack里面的Overlay摄像机,然后Stack里面的顺序,会影响到Overlay摄像机的渲染先后顺序。
2、用脚本控制URP的摄像机
1.修改摄像机属性
在使用URP的摄像机时,原来Unity的Camera里面的对应API有些还能运作,比如clearFlags、backgroundColor、orthographic、fieldOfView这些,但很多API和URP摄像机的熟悉已经对不上了。要用脚本去控制URP的摄像机,需要:
using UnityEngine.Rendering.Universal;
然后获取camera身上的UniversalAdditionalCameraData数据
UniversalAdditionalCameraData urpData = cam.GetUniversalAdditionalCameraData();
UniversalAdditionalCameraData具体的API说明:
https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@10.2/api/UnityEngine.Rendering.Universal.UniversalAdditionalCameraData.html
比如要在运行时给Base摄像机添加一个Overlay摄像机,可以这样:
UniversalAdditionalCameraData urpData = cam.GetUniversalAdditionalCameraData();
urpData.cameraStack.Add(subCam);
2.多个base摄像机同时渲染
假设场景里面有多个Base摄像机,它们之间的渲染顺序怎样确定呢?
其实Base摄像机的Priority属性,就是非URP摄像机的depth属性,可以通过这个属性给多个Base摄像机排序,而API还是camera.depth
3.渲染到RenderTexture
如果需要通过Base摄像机渲染到RenderTexture,可以把RenderTexture设置到Output Texture上。
如果用代码来设置,和普通摄像机一样,还是camera.targetTexture = rt;
不过值得注意的是,只有Base摄像机能指定输出,如果在Overlay摄像机上面指定targetTexture,会导致渲染出错。
3、关于抗锯齿
在Base摄像机上有Anti-aliasing抗锯齿选项,但如果单纯设置里面的值,是不会有抗锯齿效果的,必须把上面的PostProcessing后处理选项勾上,才会有抗锯齿的效果。如果是一个Base和多个Overlay摄像机在一起渲染,那么只有在Base或者Overlay摄像机里面其中有一个摄像机勾选了PostProcessing,那么Base摄像机里面选择的抗锯齿效果也会生效。