URP渲染管线里面的摄像机用法

文章详细介绍了URP渲染管线中摄像机的使用,包括Base和Overlay两种类型的摄像机区别,如渲染顺序、属性设置、脚本控制及抗锯齿处理。在URP中,Base摄像机负责底层渲染,Overlay用于叠加效果,且渲染顺序由Stack决定。此外,文章还提到了如何通过脚本控制摄像机属性以及渲染到RenderTexture的方法。

回到目录

大家好,我是阿赵,这里继续讲一下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摄像机里面选择的抗锯齿效果也会生效。

### Unity 6 URP 渲染管线丢失解决方案 #### 检查渲染管线设置 如果在Unity 6中发现URP渲染管线丢失,首先需要确认项目是否正确配置了Universal Render Pipeline。可以通过以下方式检查和修复: - 确保项目已安装 `com.unity.render-pipelines.universal` 包,并且版本与Unity编辑器兼容[^4]。 - 在项目设置中,转到 `Edit > Project Settings > Graphics`,验证 `Scriptable Render Pipeline Settings` 是否指向有效的URP资产文件。 #### 材质丢失的恢复方法 当从内置渲染管线升级到URP时,可能会出现材质丢失的情况。以下是几种恢复方法: - **全局升级材质**:使用Unity提供的工具批量升级项目中的所有材质为URP兼容材质[^2]。 ```csharp // 批量升级材质示例代码 using UnityEditor; using UnityEngine; public class MaterialUpgrader : EditorWindow { [MenuItem("Tools/Upgrade Materials to URP")] public static void UpgradeMaterials() { var materials = AssetDatabase.FindAssets("t:Material"); foreach (var guid in materials) { var path = AssetDatabase.GUIDToAssetPath(guid); var material = AssetDatabase.LoadAssetAtPath<Material>(path); if (material != null && !material.IsKeywordEnabled("_URP")) { material.shader = Shader.Find("Universal Render Pipeline/Lit"); Debug.Log($"Upgraded {path} to URP."); } } } } ``` - **局部升级材质**:针对特定预制体或对象手动替换其材质为URP兼容材质。 #### 摄像机配置检查 确保场景中的摄像机已正确配置以支持URP渲染管线。每个摄像机必须附加 `Universal Additional Camera Data` 组件,并设置适当的渲染路径和光照模式[^1]。 #### 调试渲染过程 如果渲染效果仍然异常,可以检查URP的渲染逻辑。URP的渲染入口是 `RenderPipeline.Render()` 方法,在该方法中会依次执行全局参数设置、摄像机排序以及逐摄像机渲染等操作[^3]。通过调试这些步骤,可以定位潜在问题。 ```csharp // 示例:调试URP渲染过程 using UnityEngine; public class URPDebugHelper : MonoBehaviour { void OnEnable() { RenderPipelineManager.beginCameraRendering += OnBeginCameraRendering; RenderPipelineManager.endCameraRendering += OnEndCameraRendering; } void OnDisable() { RenderPipelineManager.beginCameraRendering -= OnBeginCameraRendering; RenderPipelineManager.endCameraRendering -= OnEndCameraRendering; } void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) { Debug.Log($"Begin rendering for camera: {camera.name}"); } void OnEndCameraRendering(ScriptableRenderContext context, Camera camera) { Debug.Log($"End rendering for camera: {camera.name}"); } } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值