unity渲染管线及升级URP

article/2025/7/24 11:40:25

unity渲染管线及升级URP

  • 一,unity渲染管线简介
  • 二,通用渲染管线URP
  • 三,shader升级URP
    • 1,Builtin RP和URP中内置Shader 的对应
    • 2,总体结构
    • 3,include
    • 4,光照模式LightMode
    • 5,变体Variants
    • 6,预定义宏
      • 辅助宏
      • 阴影贴图
      • 纹理采样器声明
      • 光照、雾
    • 7,辅助函数
      • 变换函数
      • 通用辅助函数
      • 向前渲染函数
      • 屏幕空间
      • 顶点光照
      • 深度
      • 其他
    • 7,内置变量
    • 8,后处理
  • 参考资料

  • 22.5.31 发现这篇只能查找参考用,实际改urp看了用处不大,urp管线下pbrshader流程看新写的URP实现PBR shader吧

一,unity渲染管线简介

Unity引擎的渲染管线主要分为"渲染核心库"与"渲染策略"两个部分, “渲染核心库”是Unity把基于OpenGL/DirectX把渲染相关的接口函数封装成API,这部分Unity引擎写好后作为核心的API渲染库。”渲染策略”指的是Unity引擎绘制整个游戏场景的时候,如何处理多相机,多光源,阴影投射,物体绘制,雾,自发光等。这个就叫做渲染策略,渲染管线基于一种渲染策略,调用渲染核心库中的API,把整个游戏场景绘制出来。

渲染管线通过执行 剔除、渲染、后处理 来获取场景的内容,并将这些内容显示在屏幕上。不同的渲染管线具有不同的功能和性能特征,并且适用于不同的游戏、应用程序和平台。

  • unity提供三种渲染管线,内置渲染管线、通用渲染管线(URP)和高清渲染管线(HDRP),也可以通过unity的可编程渲染管线(Scriptable Render Pipeline,SRP) API 来完全自定义渲染管线。
    1. 内置渲染管线是unity默认的,自定义选项有限,是向前渲染(支持任意多光源,每个光照各走一遍pass性能差)。(可以用CommandBuffer和回调进行骚操作,版稳定性不好死板)
    2. URP(Universal Render Pipeline)「前身LWRP–轻量级渲染管线」是用SRP写的非侵入式轻量级自定义渲染管线,专注性能,比如只支持几个光源但能在同一个pass计算;除了有特殊需求选它就对了。
    3. HDRP可以做更多复杂算法,可以在高端平台上(PC主机等)输出高保真图形,支持全局光照、光线跟踪、子面散射等,但想得到好效果需要大量贴图,人力预算up!「因为这次主要学习URP,HDRP这里就简单了解下。也有人说HDRP太复杂了,不如直接用ue。」

在这里插入图片描述

  • 其主要区别在于渲染策略,不同的渲染策略对应的shader不一样,之前学习的shader写法都是针对向前渲染的,如果切换成URP则shader包需要重新开发。可编程渲染管线shader语法结构还是shader lab,开发语言使用HLSL,有的也支持shader graphic。

二,通用渲染管线URP

  • URP相对内置管线的优点:

    1. 开源。
    2. 渲染路径为单Pass Forward Rendering,DrawCall数量大大下降(支持动态灯光数量受GPU限制),阴影处理性能也好很多。(内置多光源时需要FowardAdd Pass,因此以前后用烘焙light map)
    3. 拓展性好,拓展入口相当于CommandBuffer的可视化操作;新设计取代了GrabPass结构,可以提供Opaque Texture。
    4. SRP Batcher,对shader的批处理,只要着色器变体一样的都一起批处理。并将shader材质数据保存在Gpu中用时绑定,而不是每次用时从缓冲区上传,以此减少渲染状态设置的CPU开销—比如glUniform4fv等设置。「变体是指shader中通过关键字设置的不同逻辑功能或者shader设置参数不同的,就是不同变体」
  • 与默认管线功能对比见URP与内置渲染管线功能对照表

  • URP与unity版本对应:
    在这里插入图片描述

三,shader升级URP

1,Builtin RP和URP中内置Shader 的对应

在这里插入图片描述

2,总体结构

  1. 在SubShader的Tags中添加"RenderPipeline" = “UniversalPipeline"表示该SubShader是给URP用的「HDRP设置为"HDRenderPipeline”」
  2. 并使用HLSL的宏替代CG:
Built-inURP
CGPROGRAM、HLSLPROGRAMHLSLPROGRAM
ENDCG、ENDHLSLENDHLSL
CGINCLUDE、HLSLINCLUDEHLSLINCLUDE
  • HLSL是URP的首选语言,但URP也支持CG语言,因此CGPROGRAM等也能用,就是和SRP Batcher 不兼容。
  1. 在Properties中声明的属性需要再在HLSL 代码中用CBUFFER声明(为了SRP Batcher):
TEXTURE2D(_BaseMap);
SAMPLER(sampler_BaseMap);CBUFFER_START(UnityPerMaterial)half4 _BaseColor;float4 _BaseMap_ST;
CBUFFER_END
  1. fixed都不支持了,改为half或者float。

3,include

  • include对应:
\Built-inURP
CoreUnity.cgincPackages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl
LightAutoLight.cgincPackages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl
ShadowsAutoLight.cgincPackages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl
Surface shadersLighting.cgincURP内没有,可以参考该github项目
  • 示例
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
  • URP其他常用include:SpaceTransforms.hlsl、ShaderVariablesFunctions.hlsl、Common.hlsl、Input.hlsl、Color.hlsl、DeclareDepthTexture.hlsl、DeclareOpaqueTextue.hlsl
  • Core.hlsl可以直接引用,UnityInput.hlsl、UnityInstancing.hlsl、SpaceTransforms.hlsl等需要带上前缀,防止重定义。

4,光照模式LightMode

  • Builtin RP和URP对应的光照模式:
Built-inURP
ForwardBaseUniversalForward
ForwardAdd移除,开启关键字_ADDITIONAL_LIGHTS解决
Deferred 以及相关URP12.0支持
Vertex and related移除
ShadowCasterShadowCaster
MotionVectors暂不支持
  • URP新增的:DepthOnly、Meta(用于烘焙光照贴图)、Universal2D(用于2D的前向渲染)、UniversalGBuffer(延迟渲染用)、UniversalForwardOnly(延迟渲染中表示该pass用向前渲染)。

5,变体Variants

  • 类似内置管线用multi_compile_fwdbase编译ForwardBasePass;URP涉及批处理的变体,可以用#pragma multi_compile添加关键字设置:
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
#pragma multi_compile _ _SHADOWS_SOFT
#pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE

6,预定义宏

辅助宏

Built-inURP
UNITY_PROJ_COORD(a)移除,改用 a.xy/a.w
UNITY_INITIALIZE_OUTPUT(type, name)ZERO_INITIALIZE(type, name)

阴影贴图

参考Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl

Built-inURP
UNITY_DECLARE_SHADOWMAP(tex)TEXTURE2D_SHADOW_PARAM(textureName, samplerName)
UNITY_SAMPLE_SHADOW(tex, uv)SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3)
UNITY_SAMPLE_SHADOW_PROJ(tex, uv)SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord4.xyz/coord4.w)
UNITY_SHADOW_COORDS(x)float4 shadowCoord : TEXCOORD##x
TRANSFER_SHADOW(a)a.shadowCoord = TransformWorldToShadowCoord(worldSpacePosition)
SHADOWS_SCREEN移除了

纹理采样器声明

Built-inURP
UNITY_DECLARE_TEX2D(name)TEXTURE2D(textureName); SAMPLER(samplerName);
UNITY_DECLARE_TEX2D_NOSAMPLER(name)TEXTURE2D(textureName);
UNITY_DECLARE_TEX2DARRAY(name)TEXTURE2D_ARRAY(textureName); SAMPLER(samplerName);
UNITY_SAMPLE_TEX2D(name, uv)SAMPLE_TEXTURE2D(textureName, samplerName, coord2)
UNITY_SAMPLE_TEX2D_SAMPLER(name, samplername, uv)SAMPLE_TEXTURE2D(textureName, samplerName, coord2)
UNITY_SAMPLE_TEX2DARRAY(name, uv)SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index)
UNITY_SAMPLE_TEX2DARRAY_LOD(name, uv, lod)SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod)
UNITY_INITIALIZE_OUTPUT(name)ZERO_INITIALIZE(name)

光照、雾

Built-inURP
UNITY_LIGHTMODEL_AMBIENThalf3(unity_SHAr.w,unity_SHAr.w,unity_SHAr.w);
UNITY_FOG_COORDS(x)用float fogCoord : TEXCOORD##x;
UNITY_TRANSFER_FOG(o, outpos)o.fogCoord = ComputeFogFactor(clipSpacePosition.z);
UNITY_APPLY_FOG(coord, col)color = MixFog(color, i.fogCoord);

7,辅助函数

变换函数

Built-inURP
float4 UnityObjectToClipPos(float3 pos)float4 TransformObjectToHClip(float3 positionOS)
float4 UnityWorldToClipPos(float3 pos)float4 TransformWorldToHClip(float3 positionWS)
float3 UnityObjectToViewPos(float3 pos)TransformWorldToView(TransformObjectToWorld(positionOS))
float3 UnityObjectToWorldNormal(in float3 norm)float3 TransformObjectToWorldNormal(float3 normalOS,bool doNormalize = true)
float3 UnityWorldSpaceViewDir (float4 v)_WorldSpaceCameraPos.xyz - positionWS
float3 UnityObjectToWorldDir (float4 v)float3 TransformObjectToWorldDir(real3 dirOS)

通用辅助函数

Built-inURP
float3 ObjSpaceViewDir (float4 v)TransformWorldToObject(GetCameraPositionWS()) - objectSpacePosition;
float2 ParallaxOffset (half h, half height, half3 viewDir)移除了。可以从UnityCG.cginc复制过来
fixed Luminance (fixed3 c)real Luminance(real3 linearRgb)
fixed3 DecodeLightmap (fixed4 color)real3 DecodeLightmap(real4 encodedIlluminance, real4 decodeInstructions)
float4 EncodeFloatRGBA (float v)移除了。可以从UnityCG.cginc复制过来
float DecodeFloatRGBA (float4 enc)移除了。可以从UnityCG.cginc复制过来
float2 EncodeFloatRG (float v)移除了。可以从UnityCG.cginc复制过来
float DecodeFloatRG (float2 enc)移除了。可以从UnityCG.cginc复制过来
float2 EncodeViewNormalStereo (float3 n)移除了。可以从UnityCG.cginc复制过来
float3 DecodeViewNormalStereo (float4 enc4)移除了。可以从UnityCG.cginc复制过来

向前渲染函数

Built-inURP
float3 WorldSpaceLightDir(float4 v)_MainLightPosition.xyz - TransformObjectToWorld(objectSpacePosition)
float3 ObjSpaceLightDir (float4 v)TransformWorldToObject(_MainLightPosition.xyz) - objectSpacePosition
float3 Shade4PointLights (…)用half3 VertexLighting(float3 positionWS, half3 normalWS)

屏幕空间

Built-inURP
float4 ComputeScreenPos (float4 clipPos)float4 ComputeScreenPos(float4 positionCS)
float4 ComputeGrabScreenPos (float4 clipPos)移除了

顶点光照

Built-inURP
float3 ShadeVertexLights (float4 vertex, float3 normal)用half3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w) + VertexLighting(…)

深度

可直接使用 _CameraDepthTexture来采样深度纹理,也可使用SampleSceneDepth(…) 和 LoadSceneDepth(…)来采样。

Built-inURP
LinearEyeDepth (sceneZ)LinearEyeDepth(sceneZ, _ZBufferParams)
Linear01Depth (sceneZ)Linear01Depth(sceneZ, _ZBufferParams)

其他

Built-inURP
shadeSH9 (float4 normal)SampleSH(normal)
unity_ColorSpaceLuminance用Luminance()

7,内置变量

Built-inURP
_LightColor0_MainLightColor
_WorldSpaceLightPos0_MainLightPosition
_LightMatrix0移除了。目前尚不支持
unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0在URP中,其他光源存储在数组/缓冲区中(取决于平台)。使用Light GetAdditionalLight(uint i, float3 positionWS)获取光源信息
unity_4LightAtten0同上
unity_LightColor同上)
unity_WorldToShadowfloat4x4 _MainLightWorldToShadow[MAX_SHADOW_CASCADES + 1] 或者_AdditionalLightsWorldToShadow[MAX_VISIBLE_LIGHTS]

使用循环所有其他灯光–GetAdditionalLight(),查询其他灯光计数–GetAdditionalLightsCount()。

8,后处理

  • URP不支持OnPreCull,OnPreRender,OnPostRender和OnRenderImage。
  • 支持OnRenderObject和OnWillRenderObject,但旧管线直接用有问题,需要改写。
  • UPR函数+示例:
beginCameraRendering(ScriptableRenderContext context, Camera camera)
endCameraRendering(ScriptableRenderContext context, Camera camera)
beginFrameRendering(ScriptableRenderContext context,Camera[] cameras)
endFrameRendering(ScriptableRenderContext context,Camera[] cameras)
void OnEnable()
{RenderPipelineManager.beginCameraRendering += MyCameraRendering;
}void OnDisable()
{RenderPipelineManager.beginCameraRendering -= MyCameraRendering;
}void MyCameraRendering(ScriptableRenderContext context, Camera camera)
{...if(camera == myEffectCamera){...UniversalRenderPipeline.RenderSingleCamera(context, camera);}...
}

参考资料

  1. unity官方文档
  2. 知乎-Unity URP/SRP 渲染管线浅入深出
  3. From Built-in to URP
  4. 内置到URP官方切换文档

http://chatgpt.dhexx.cn/article/eiJVCJ9B.shtml

相关文章

Unity2020高清渲染管线

一、高清渲染管线加载与环境配置 这里使用2019.3.0f6版本 1、加载高清渲染管线(High Definition RP) 2、创建高清管线脚本文件 3、配置高清渲染管线环境(把色彩空间改为线性空间) 4、把高清渲染管线脚本添加到图形(G…

渲染管线流程

应用阶段--->几何阶段---->光栅化阶段---->逐片元操作----->后处理 1,应用阶段:粗粒度剔除,进行渲染设置,准备基本数据,输出到几何阶段。 2,几何阶段:顶点着色器,曲面细…

渲染管线入门

渲染管线中一些技术名词大部分是英文直译,光看中文很容易被误导。所以我们必须在了解一个技术的具体作用之后,才能了解它到底是什么。这篇博客我主要翻译自Minh Tri Do Dinh的GPUs - Graphics Processing Units一文。也就是一些论坛里推荐给新手阅读的图…

【OpenGL ES】渲染管线

1 前言 渲染管线是指图形渲染流程,涉及到的概念非常多,主要包含图元、片段、光栅化、空间、变换、裁剪、着色器、片段测试、混合等。渲染管线主体流程如下: 为方便读者理解渲染管线,本文将先介绍顶点数据、图元与片段、空间与变换…

渲染管线----通俗易懂向面试官介绍

本文通过简短的语言解释渲染管线,无论是第一次了解渲染管线,还是回顾,都有帮助。 一、完整渲染流程 在介绍渲染管线之前,先全局视角了解一下整个渲染引擎。 整个渲染分为五个阶段,如图 工具阶段、资产调节阶段、应用程…

学习笔记(一)渲染管线

目录 前言 一些疑问 一、什么是渲染管线? 二、为啥这玩意是个流水线? 1.CPU与GPU 2.CPU和GPU数据交互 3.CPU和GPU并行工作 Step1.应用程序阶段(The Application Stage) 一、把数据加载到显存中。 二、设置渲染状态。 三…

计算机图形学笔记(一)渲染管线概述

计算机图形学笔记(一)渲染管线概述 写在前面:因为之前有学习过图形学,博文是对过去知识的拾遗和对学习过程中的总结记录,所以在内容组织上可能不符合逻辑,某些比较熟悉的内容不会体现或简述;在整…

渲染基础-渲染管线(Render-pipeline)

一开始学习计算机图形学的小伙伴们肯定对于渲染管线有一点迷茫,至少当初我就有点迷茫,为了能对后来对计算机图形学感兴趣的萌新小伙伴起到一些帮助,在这里简单讲解一下渲染管线(Render-pipeline)。 该文章还有很多不足…

如何使用SPSS确定建立的回归模型能用于预测分析?

当需要研究一组随机变量与另一组变量的关系时,通常会运用回归分析。通过回归分析构建数学模型,探究两种或两种以上变量之间是否存在关系,若存在关系还可进一步预测未来的数据。 当自变量有多个而因变量只有一个时,则可构建spss多…

如何使用SPSS判断数据的正态分布

当我们应用统计方法对数据进行分析时,会发现许多计量资料的分析方法,例如常用的T检验、方差分析、相关分析以及线性回归等等,都要求数据服从正态分布或者近似正态分布,但这一前提条件往往被使用者所忽略。因此为了保证数据满足上述…

如何使用SPSS进行判别分析

今天将为大家讲解使用spss进行判别分析的相关步骤。 1.Discriminant Analysis判别分析主对话框 如图 1-1 所示 图 1-1 Discriminant Analysis 主对话框 (1)选择分类变量及其范围 在主对话框中左面的矩形框中选择表明已知的观测量所属类…

IBM SPSS Statistics定义变量使用介绍

IBM SPSS Statistics是一款强大的数据分析软件,它可以帮助我们解决很多复杂的统计学问题,使用SPSS的第一步就是要学会如何定义变量,下面让我们走进今天的SPSS入门教程。 一、进入变量视图 在定义变量之前,我们需要进入IBM SPSS …

SPSS使用过程中出现的问题整理 包括因子分析 感谢各位大佬们

spss使用方法整理 包括因子分析 一、遇到问题:spss导入excel数据显示:对于当前服务器语言环境而言,文本值过长二、SPSS数据分析-从EXCEL导入三、因子分析在SPSS中的操作过程及结果解读 一、遇到问题:spss导入excel数据显示:对于当前服务器语言环境而言,文…

通过SPSS使用命令语法实现快速删除变量的步骤

当我们面对一个庞大的数据集的时候,我们想要对该数据集进行一些操作,可能会觉得比较繁琐。为了快速精准的实现数据过滤操作, SPSS是自带了语法功能,通过语法即可快速实现复杂操作。今天小编将通过快速删除变量的操作,让…

SPSS入门教程—相关性分析使用方法

IBM SPSS Statistics为用户提供了三种相关性分析的方法,分别是双变量分析、偏相关分析和距离分析,三种相关分析方法各针对不同的数据情况,接下来我们将为大家介绍如何使用SPSS相关性分析中的距离分析。 一、数据简述 距离分析和其他两类相关…

使用IBM SPSS Statistics的新手应该如何入门

一、什么是IBM SPSS Statistics? IBM SPSS Statistics 是一款强大的统计软件平台,它所提供的数据分析功能,可以帮助企业、个人对各类数据进行切实可行的洞察分析,从而获取有效信息。 二、为什么要进行SPSS数据分析? …

【SPSS】包含多元线性回归、聚类分析、判别分析、主成分、相关系数、非参数秩检验的spss使用方法,含有相关例题,可以解决“数学建模”中数据建模的大部分问题

记录《多元统计分析》关于spss软件的使用,本篇教程不涉及具体模型的推导,通过例题来带领大家入门spss软件,学习软件基本的使用,解决常见数模问题。 本篇所有数据都可以在百度网盘上下载: 链接:https://pan.…

关于SPSS软件的使用

最近由于调研的需要,需要使用spss软件:Statistical Product and Service Solutions,“统计产品与服务解决方案”软件 1.首先是定义变量: 选择左下角“变量视图”,我们调查问卷的每一道题都可以作为一个变量&#xff0c…

spss登录本地计算机,SPSS基本使用

1.定义变量 名称不能用$,后面加.,保留字会歧义,不区分大小写 标签是对变量的补充说明 测量 : 名义:代表不同的类别,不能比较大小。如 性别 度量:可以比较大小 如距离、长度 有序:分类变量(大小之间有等级顺序)如:满意,很满意,不满意。。。。 2.SPSS导入数据库文件时,…

spss安装使用

1.下载spss24 百度云链接如下: 64位安装包:https://pan.baidu.com/s/19_nW1eJh5HN8Q_PAEUzfTg 提取码:l5fc 32位安装包:https://pan.baidu.com/s/14wga9CrNnysTImOaO6JW-Q 提取码:ayl5 安装教程下载&#xff…