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

news2024/11/17 13:33:56

简介

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.coloradmin.cn/o/695188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

客户关系管理系统有哪些?5款客户关系管理软件评测

客户关系管理系统是一种企业与客户之间的交互平台&#xff0c;它将客户的需求、市场环境、企业的发展战略等融入到整个业务流程中&#xff0c;在企业和客户之间建立起一个共享的资源库&#xff0c;使企业对客户的了解更深更全面&#xff0c;进而实现与客户的深入互动&#xff0…

C#创建窗体应用程序

1、新建项目&#xff0c;选择窗体应用 2、打开相关视图 工具箱&#xff1a;将工具箱中的控件直接拖拽到界面中&#xff0c;会自动生成对用的控件。 属性&#xff1a;可以设置控件的相关属性&#xff0c;包括事件&#xff0c;双击 3、设计应用界面 4、新建一个交互窗口 5、在登…

MVP(Multi-view Prompting):多视图提示改进了方面情感元组预测

论文题目&#xff08;Title&#xff09;&#xff1a;MVP: Multi-view Prompting Improves Aspect Sentiment Tuple Prediction 研究问题&#xff08;Question&#xff09;&#xff1a;多视图提示对方面情感元组检测的影响 研究动机&#xff08;Motivation&#xff09;&#x…

AI智能人脸识别,抠图-应用证件照

效果展示&#xff1a; 关键代码&#xff1a; import numpy as np import cv2 import osdef crop_face(source_image_path, output_folder_path, tag_width, tag_height):face_detector cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xm…

【算法题解】45. N叉树的层序遍历

这是一道 中等难度 的题 https://leetcode.cn/problems/n-ary-tree-level-order-traversal/ 题目 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 nu…

fopen,fputs,fgets,fclose

fopen 是打开文件 fputs 往文件里面写内容(里面有2个参数其中第一个是一个char 型 数组用于存放读取的字符串&#xff0c;表示读取 1-n个字符。第二个表示是文件读入指针) fgets 读取文件里面的内容 (里面有三个参数其中 第一个是一个char 型 数组用于存放读取的字符串。第二…

阿里云安全组 IP地址段 设置方法 斜线后面数字含义

比如公司搬家后,我的ip变成了101.83.11.11 但我希望安全组中.只限制ip的前2段,后面两段是多少,都不会限制访问 先登录阿里云的服务器管理后台,找到主机,进安全组,添加 设置方法为 端口1234为自定义的,比如远程桌面访问你的服务器,源:就是ip地址段. 101.83.1.1/16解释 斜杠…

使用 Jetpack Compose 构建 LinearProgressIndicator

欢迎阅读这篇关于如何使用 Jetpack Compose 构建 LinearProgressIndicator&#xff08;线性进度指示器&#xff09;的博客。Jetpack Compose 是 Google 推出的一款现代化 UI 工具包&#xff0c;用于构建 Android 界面。其声明式的设计使得 UI 开发更加简洁、直观。 什么是 Line…

mfc100u.dll丢失的各种解决方法分享,探究mfc100u.dll文件

在计算机系统中&#xff0c;有许多重要的文件扮演着关键角色。其中之一就是Mfc100u.dll&#xff0c;一但这个文件丢失了&#xff0c;那么你的电脑就会出现问题&#xff0c;如程序运行不了等等。今天主要来给大家讲讲Mfc100u.dll这个文件&#xff0c;mfc100u.dll丢失的各种解决方…

由spring定时任务@Scheduled(cron = “0 0 0/1 * * ?“)引起的坑

这两天做到的一个功能&#xff0c;定时任务每整点生成一条记录&#xff0c;然后使用的cron表达式是&#xff1a; Scheduled(cron "0 0 0/1 * * ?")意为每整点执行一次。 定时任务执行之后使用new Date() 拿到当前本机时间&#xff0c;作为记录的创建时间&#xf…

使用Jmeter完成数据库造数

1.添加驱动 如果使用jmeter连接数据库&#xff0c;需要在jmeter的lib下添加对应的数据库驱动 MySQL: mysql-connector-jar Oracle: ojdbc6-11.2.0.3.jar ps:找到自己对应的驱动版本 2.bin目录启动 localhost bin % sh jmeter.sh ps: Jmeter版本&#xff1a;5.6 mysq…

在windows同时安装两个idea的方法教程

因为近期使用jdk17&#xff0c;所以需要升级Idea的版本&#xff0c;但是我电脑之前用的Idea2018,我又不想卸载&#xff0c;所以想同时装两个版本的。 安装教程如下&#xff1a; IDea官网&#xff1a;https://www.jetbrains.com.cn/idea/download/?sectionwindows 在官网下载.…

从文本、图像到音视频,AIGC技术将如何重构我们的数字世界?

引言 1950 年&#xff0c;艾伦图灵提出著名的「图灵测试」&#xff0c;给出判定机器是否具有智能的试验方法。16 年后&#xff0c;世界上第一款可人机对话的机器人“Eliza”问世&#xff0c;这是 AI 技术最早期的萌芽阶段。但由于当时的科技水平限制&#xff0c;AIGC 仅限于小…

【MySql】C语言连接mysql|图形化工具

文章目录 Connector/C 使用mysql接口介绍Navicat远程连接数据库 Connector/C 使用 说完了mysql的基础,后面我们只关心使用&#xff0c;要使用C语言连接mysql&#xff0c;需要使用mysql官网提供的库&#xff0c;前往官网下载即可。 但是实际上我们并不需要这样去做&#xff0c;…

Feign、Ribbon、Hystrix(铁三角)以及三者超时时间配置

在微服务架构中很多功能都需要调用多个服务才能完成某一项功能&#xff0c;一个成熟的微服务集群&#xff0c;内部调用必然依赖一个好的 RPC 框架&#xff0c;比如&#xff1a;基于 Http 协议的 Feign&#xff0c;基于私有 tcp 协议的 Dubbo 1. Feign 是什么 Feign 是Spring …

Consul 理解

Consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案&#xff0c;不再需要依赖其他工具&#xff08;比如ZooKeeper等&#xff09;。服务部署简单&#xff0c;只有一…

SpringBoot实现自定义配置属性提示

前言 我们在使用SpringBoot开发项目时&#xff0c;常常需要编写一些属性配置类&#xff0c;用来完成自定义或特定的属性配置。在配置文件application.yml中&#xff0c;IDEA会自动提示官方默认的相关配置且可以点击属性自动跳转到属性对应的配置类中&#xff0c;实现快速查看属…

力扣387:字符串中的第一个唯一字符

题目描述&#xff1a;给定一个字符串s&#xff0c;找到它的第一个不重复字符&#xff0c;并返回索引&#xff0c;如果不存在&#xff0c;则返回-1. 提示&#xff1a;s 不为空且 s 只包含小写字母 思路&#xff1a; 将字符串中的每个字符遍历一次&#xff0c;将其中每个字符以…

基于Java斗车交易系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

centos下的Nginx, tar安装不能使用systemctl启动问题

1.systemctl start nginx启动报错 2.报错原因 解压方式nginx&#xff0c;系统服务内没有nginx的服务&#xff0c;所以报错 3.配置nginx系统服务 1)/etc/init.d/目录下创建nginx 2)nginx文件内容 #!/bin/sh # nginx - this script starts and stops the nginx daemin # # c…