Unity内置渲染管线升级URP教程

简介

URP全称为Universal Render Pipeline(通用渲染管线),可以提供更加灵活的渲染方案,通过添加Render Feature实现各种渲染效果。并且可以针对移动平台进行专门的优化,同时还提供了SRPBatcher提高渲染效率。Unity的一些工具,比如ShaderGraph,也是必须在URP管线下才可以使用,可以说许多方面均优于内置渲染管线。

所以如果还在使用内置渲染管线的,建议尽早升级到URP。通过本文,可以了解到如何从内置管线升级到URP。并且记录了一些升级时可能遇到的问题和解决方法。

一、安装并配置URP

1.安装对应package

2.创建配置

Create->rendering->Universal pipeline->Pipeline Asset(Forward Renderer)生成两个配置文件(目前放在Pipeline文件夹下)

Edit->Project Settings->Graphics 界面,将UniversalRenderPipelineAsset拖入

3.统一升级自带的shader

Edit->Render Pipeline->Universal Render Pipeline-> Upgrade Project Materials to Universal PR Materials

可以将使用默认built-inShader升级到URP的Shader

二、关于内置管线升级至URP管线的问题处理

在未使用URP管线的时候,由于一些shader是使用CG语言写的,而URP并不支持该语言。所以需要将其改为HLSL(High level shader language)编写。

查看对应源文件

1、cginc文件的内置函数可以在Editor引擎安装目录下查看  xxx\Editor\2020.1.0f1c1\Editor\Data\CGIncludes

2、hlsl文件则是在工程对应的Library文件下可以找到:

以Core.hlsl为例子,头文件路径为

Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl

实际在工程中的位置是

xxx\ProjectName\Library\PackageCache\com.unity.render-pipelines.universal@8.2.0\ShaderLibrary\Core.hlsl

宏替换

C#
CGPROGRAM    ENDCG    //替换前是CG语言的宏 

HLSLPROGRAM    ENDHLSL    //替换后使用HLSL语言的宏

包含的头文件替换

C#
#include "UnityCG.cginc"//替换前
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"//替换后

//----------------------------分割线---------------------------------------

#include "Lighting.cginc"//替换前
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"//替换后
  

Tag替换

C#
Tags { "LightMode" = "ForwardBase" } //替换前
Tags { "RenderPipeline" = "UniversalPipeline" }//替换后

Texutre2D的处理

C#
uniform sampler2D _BumpMap; //替换前是一个sampler2D变量
TEXTURE2D(_MainTex);//替换后需要使用两个变量 TEXTURE2D和sampler
SAMPLER(sampler_MainTex);

//----------------------------分割线---------------------------------------

float4 mainColor = tex2D(_MainTex, i.tex);//替换前对texture2d的采样是两个参数
float4 mainColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.tex);//替换后是
//三个参数的函数,前两个参数,就是一开始对声明替换时的两个参数.
 

参考文档

升级Urp

https://www.jianshu.com/p/3fef69e2efb6

https://zhuanlan.zhihu.com/p/147228689

三、场景内组件修改

1.多相机修改

URP管线相机不再支持相机的depth属性。主摄像机RenderType设置为base。其他的摄像机的RenderType 都是Overlay类型。

并且需要将其他相机加入到主相机的Stack中

四、如何启用SRPBatcher

SRP Batcher 是一个渲染循环,可通过许多使用同一着色器变体的材质来加快场景中的 CPU 渲染速度。虽然不会减少DC的次数,但是SRPBatcher可以降低准备DC数据的耗时。相关的官方文档https://docs.unity3d.com/cn/2020.2/Manual/SRPBatcher.html

注意事项

同一个Shader不能同时启用SRP Batcher或者Gpu Instance。并且SRP Batcher的优先级是最高的。会导致原先可以合批的DC被打断。

1.设置

需要在URP设置中的Advaneced->SRP Batcher打开

2.修改Shader以支持SRPBatcher

需要用CBUFFER_START(UnityPerMaterial)CBUFFER_END,将所有Properties内声明的变量包住。例子如下:

C#
Properties
{
    _Tint("_Tint", Color) = (1,1,1,1)
    _MainTex("_MainTex (albedo)", 2D) = "white" {}
    _Specular ("Specular", Color) = (1, 1, 1, 1)
    _Gloss ("Gloss", Range(8.0, 256)) = 80
 }
SubShader
{
     Pass
     {
         CBUFFER_START(UnityPerMaterial)//这里是添加的代码
         TEXTURE2D(_MainTex);
         SAMPLER(sampler_MainTex);
         float4 _MainTex_ST;
         float4 _Specular;
         float _Gloss;
         half4 _Tint;
         CBUFFER_END//这里是添加的代码
      }
}

需要注意的是,像Properties内的纹理变量,虽然声明的时候只有一个变量,但是相关的SAMPLER变量也要包在CBUFFER内。

修改后如果支持SRPBatcher,在对应shader的Inspector界面的SRPBatcher属性会显示为compatible

如果是不支持SRPBatcher的Shader对应Shader的SRPBatcher属性会显示为not compatible,并且会显示不支持的原因

3.SRPBatcher性能优化的检测工具

1.添加SRPBatcherProfiler.cs文件添加到工程中,代码库地址是https://github.com/Unity-Technologies/SRPBatcherBenchmark

2.将SRPBatcherProfiler脚本拖到需要进行检测的场景中,点击F8显示/隐藏SRPBatcherProfiler界面,点击F9打开/关闭(实际发现F9功能不好使,无法中途打开关闭)SRPBatcher功能。可以对比打开该功能前后的CPU消耗情况。

.升级URP之后的一些异常现象

1.Culling mask导致光照的表现不同

升级URP后发现物体的光照表现不太一样。经过测试发现,在内置管线时,light的Culling mask是有效的,而在URP下,Culling mask失效了。多光源的情况下,HLSL和GC两个Shader通过GetMainLight获取的光线都是不同的。

处理方式是获取所有的AddtionalLight,然后根据light的distanceAttenuation值去判断,哪个光源是真正作用在目标物体上的。(Culling mask校验通过的光源light.distanceAttenuation不为0)

C#
                Light light = GetMainLight();
                if( light.distanceAttenuation == 0)
                {
                     int addLightsCount = GetAdditionalLightsCount();//定义在lighting库函数的方法 返回一个额外灯光的数量
                     for (int idx = 0; idx < addLightsCount; idx++)
                     {
                        Light addlight = GetAdditionalLight(idx, i.worldPos);//定义在lightling库里的方法 返回一个灯光类型的数据
                        if(addlight.distanceAttenuation>0)
                        {
                            light = addlight;
                            break;
                        }
                     }
                }

2.Frame Debugger显示异常

2020.3.36f1c1版本中,打开FrameDebugger。场景并不会随着渲染阶段而变化

找到相关文章,该问题是Unity的Bug,在关闭urp的msaa选项之后,FrameDebugger就可以正常显示

3.报错 Shader properties can't be added to this global property sheet. Trying to add _GrabTexture_TexelSize (type 1 count 1)

UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)

Shader properties can't be added to this global property sheet. Trying to add _GrabTexture_HDR (type 1 count 1)

UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)

这个是因为URP不支持GrabPass导致,处理方法是将Shader中无用的GrabPass删除,如果需要用到屏幕截图,修改成HLSL语言,然后利用SAMPLER(_CameraOpaqueTexture);来代替grabTexture

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4285.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《项目实战》构建SpringCloud alibaba项目(三、构建服务方子工程store-user-service)

系列文章目录 构建SpringCloud alibaba项目&#xff08;一、构建父工程、公共库、网关&#xff09; 构建SpringCloud alibaba项目&#xff08;二、构建微服务鉴权子工程store-authority-service&#xff09; 构建SpringCloud alibaba项目&#xff08;三、构建服务方子工程stor…

95道MongoDB面试题

1、mongodb是什么&#xff1f; MongoDB 是由 C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。 再高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。 MongoDB 旨在给 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数…

前端技术栈 - ES6 - Promise -模块化编程

文章目录 &#x1f55b;ES6⚡let变量⚡const常量⚡数组解构⚡对象解构⚡模板字符串⚡对象声明简写⚡对象方法简写⚡对象运算符扩展⚡箭头函数⚡作业布置 &#x1f550;Promise⚡需求分析⚡传统ajax回调嵌套⚡promise改进⚡promise异常捕获⚡promise链式调用⚡promise代码重排优…

Spark 3.4.x Server Client模式下的数据传输实现

背景 在Spark中python和jvm的通信杂谈–ArrowConverter中&#xff0c;我们提到Spark 3.4.x中是Client和Server之间的数据传输是采用Arrow IPC的&#xff0c;那具体是怎么实现的呢&#xff1f; 分析 直接上代码ClientE2ETestSuite test("createDataFrame from complex t…

Redis————主从架构

主从架构搭建 单机多实例 粗制一份redis.conf文件 将相关配置修改为如下值&#xff1a; port 与主节点端口后不相同即可 pidfile pid进程号保存文件pidfile的路径 logfile 日志文件名称 dir 指定数据存放目录 #需要注释掉bind #bind 127.0.0.1&#xff08;bind绑定的是自己机…

Git使用与配置

Git分布式版本控制工具 一、Git安装与配置 Git基本配置 打开Git Bash 设置用户信息 # 配置用户名和用户邮箱 git config --global user.name xxx git config --global user.email xxxxx.com查看用户信息 # 查看用户名和用户邮箱 git config --global user.name git config --g…

【前端|CSS系列第1篇】CSS零基础入门之CSS的基本概念和选择器

欢迎来到CSS零基础入门系列的第一篇博客&#xff01;在这个系列中&#xff0c;我们将一起学习CSS&#xff08;层叠样式表&#xff09;的基础知识&#xff0c;探索如何为网页添加样式和布局。本篇博客将重点介绍CSS的基本概念和选择器&#xff0c;帮助你理解CSS的核心概念。 1.…

【数据结构OJ题】链表带环问题

目录 1.判断链表是否带环 证明 2.寻找环的入口点 1.判断链表是否带环 原题链接&#xff1a;力扣 思路一&#xff1a;先遍历一遍链表&#xff0c;计算出链表的长度&#xff0c;然后将长度除二&#xff0c;在遍历半个链表即可。但是这种方法效率比较低。 思路二&#xff1a;…

学习一波Java语言中的优先队列 PriorityQueue

目录 一、什么是优先队列 二、PriorityQueue 如何使用 三、优先队列的使用场景 一、什么是优先队列 优先队列是一种特殊的队列数据结构&#xff0c;它根据元素的优先级来确定元素的顺序。与普通队列不同的是&#xff0c;优先队列中的元素并不按照插入的先后顺序进行排列&am…

线性代数基础--向量

目录 向量的概念 基本概念 抽象概念 向量的意义 几何意义 物理意义 欧式空间 特点和性质 行向量与列向量 行向量 列向量 两者的关系 向量的基本运算与范数 向量的基本运算 向量的加法 数乘运算&#xff08;实数与向量相乘&#xff09; 转置 向量的范数 向量…

恒生电子联合恒生聚源发布数智金融新品,聚焦大模型技术金融业务应用

6月28日&#xff0c;恒生电子和旗下子公司恒生聚源正式发布基于大语言模型技术打造的数智金融新品&#xff0c;金融智能助手光子和全新升级的智能投研平台WarrenQ。此外&#xff0c;恒生电子金融行业大模型LightGPT也首次对外亮相&#xff0c;并公布最新研发进展。 恒生电子董…

线性代数高级--矩阵的秩--SVD分解定义--SVD分解的应用

目录 矩阵的秩 概念 k阶子式 矩阵的秩的定义 矩阵的秩的性质 SVD分解 概念 注意 SVD的分解过程 SVD分解的应用 矩阵的秩 概念 矩阵的秩是线性代数中的一个重要概念&#xff0c;用于描述矩阵的行&#xff08;或列&#xff09;向量的线性无关程度。矩阵的秩可以通过…