URP渲染管线

一、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 体系

Unity中Shader URP 简介_unity urp shader-CSDN博客

二、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"
}