一、URP渲染管线的含义
URP渲染管线又名为通用渲染管线(Universal Render Pipeline)
通用渲染管线(Universal Render Pipeline,URP)是 SRP 中的一种,URP 旨在提供轻量级、跨平台的渲染功能,适用于各种不同类型的项目,包括移动、VR/AR 和 2D 项目等
其中SRP是由(URP通用渲染管线)和(HDRP高清渲染管线)组成,SRP是可脚本化渲染管线,是 Unity 引擎中一种可定制的渲染系统,它允许开发者通过编写脚本来自定义渲染流程,以满足不同项目的特定渲染需求
内置渲染管线、通用渲染管线URP、高清渲染管线的HDRP的关系:
Unity 的渲染管线包括(内置渲染管线)和 (SRP),内置渲染管线是 Unity 默认的渲染管线,它有固定的渲染流程,自定义选项有限,开发者难以对其渲染流程进行深度修改。而 SRP 是一种可编程渲染管线,允许开发者通过 C# 脚本控制和定制渲染流程,具有更高的灵活性和可扩展性2。其中URP(通用渲染管线)和 HDRP(高清渲染管线)是基于 SRP 构建的具体实现,属于 SRP 体系
二、URP渲染管线的安装和设置
1. 安装:Window -> Project Manager -> 搜索 Render
- 选择 Core Render Pipeline Library 安装
- 选择 Universal Render Pipeline 安装
2. 创建一个unity的相关配置资源 Create -> Rendering -> URP Assets(with Universal Render)
3. 在Project Settings中更改渲染管线的类型为URP通用渲染管线
三、URP渲染管线下Shader代码
在 URP 渲染管线下,Shader 代码通常使用 HLSL语言
- 首先在Shader代码中需要声明
"RenderPipeline"="UniversialPipeline" //表明渲染管线为通用渲染管线
- 还需要引入相应的库
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"
- 在Pass中需要使用 HLSLPROGRAM / ENDHLSL 来包裹代码块
Pass
{
HLSLPROGRAM
....
ENDHLSL}
- 在 HLSLPROGRAM 和 ENDHLSL 之间需要声明顶点着色器和片元着色器
//与CG代码中的相同
#pragma vertex vert //声明顶点着色器
#pragma fragment frag //声明片元着色器
- 顶点着色器的输入结构体相对于CG语言有所改变
//HLSL
struct Attributes
{
....
}
//CG
struct appdate
{
....
}
在顶点着色器的输入结构体中
positionOS : 代表对象的顶点坐标 语义为POSITION
float3 positionOS : POSITION;
- 顶点着色器的输出结构体相对于CG语言也有所改变
//HLSL
struct Varyings
{
....
}
//CG
struct v2f
{
....
}
在顶点着色器的输出结构体中
positionCS : 代表对象的裁剪空间下的坐标 语义为SV_POSITION
float3 positionCS : SV_POSITION;
- 顶点着色器
//HLSL
Varyings vert ( Attributes v )
{
Varyings o=(Varyings)0; //初始化
....
return o;
}
//CG
v2f vert ( appdate v )
{
....
}
在顶点着色器中将模型的本地空间坐标转换为裁剪空间下的坐标:
o.positionCS = TransformWorldToHClip ( positionWS );
将本地空间转换为世界空间:
float3 positionWS = TransformObjectToWorld ( v.positionOS );
- 片元着色器
//HLSL
half4 frag ( Varyings i ) : SV_Target
{
....
}
//CG
float4 frag ( v2f i ) : SV_Target
{
....
}
-
在HLSL语言中变量类型变化——剔除了 fixed 类型变量
float类型:一般用于 坐标 和 位置 信息存储
half类型:一般用于 颜色 这些精度较小的值
Shader "unity/ShaderGraphicUnlit"
{
Properties
{
}
SubShader
{
Tags
{
//标记渲染管线为通用渲染管线URP,告诉引擎此Shader是用于URP渲染管线下的
"RenderPipeline"="UniversalPipeline"
//(不透明的渲染类型)RenderType标签可以让Unity把这个shader归入到提前定义的组
"RenderType"="Opaque"
//渲染队列,值为2000,通常用于不透明对象,从前往后渲染
"Queue"="Geometry"
}
Pass
{
//Name可使此Shader用于其他Shader的调用
Name "Universal Forward"
Tags
{
// LightMode: <None>
}
//裁剪
Cull Back
//混合
Blend One Zero
//深度测试
ZTest LEqual
//深度写入
ZWrite On
// HLSLPROGRAM / ENDHLSL
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
//#pragma target 2.0:适用于 Unity 支持的所有平台
#pragma target 2.0
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"
struct Attributes
{
float3 positionOS : POSITION;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
};
//顶点着色器
// v2f vert(appdate v){ ... }
Varyings vert(Attributes v)
{
Varyings o=(Varyings)0;
float3 positionWS=TransformObjectToWorld(v.positionOS);
o.positionCS=TransformWorldToHClip(positionWS);
return o;
}
//片段着色器
// fixed4 frag(v2f i):SV_Target{ ... }
half4 frag(Varyings i):SV_Target
{
half4 c;
c.rgb=0.5;
c.a=1;
return c;
}
ENDHLSL
}
}
FallBack "Hidden/Shader Graph/FallbackError"
}