unity默认渲染管线切换到URP渲染管线并切换材质

Posted 逐·風

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity默认渲染管线切换到URP渲染管线并切换材质相关的知识,希望对你有一定的参考价值。

先简单介绍一下渲染管线(URP)是什么,最初的名称是LWRP(Lightweight Render Pipeline),从2019.3版本以后改名为URP(Universal Render Pipeline),提供了对美术师友好的工作流程,可以让您在移动平台、高端游戏主机和PC等各种平台上快速轻松地创建图形,对画质有了一定的提升。如果对渲染管线有不清楚的详情请见官方文档“渲染管线”.部分。
下面我们先打开一个URP的项目,运行一个URP项目有两个办法:
第一个就是在Unity Hub打开项目的地方直接选择URP项目,详情见下图

直接选择该模板即可直接创建URP项目,不需要下载插件或者修改数据。
接下来是第二个方法,先创建一个正常的3D项目,

项目名称与位置随便即可,打开后我们选择打开Window > Package Manager界面后等待左下角加载完毕后搜索Universal RP下载对应的插件即可安装对应版本的URP。

每个unity的版本号不一样,所显示的URP版本号也会不一样,我的是2019,所以显示7.3.1,URP的版本号不一样无伤大雅。等下载完后在Project界面点击右键选择Create > Rendering > Universal Render Pipeline > Pipeline Asset(Forward Renderer)点击后生成下面两个文件。

然后在Edit > Project Settings… > Graphics将刚才创建的拖到标记处即可

如果你在创建Pipeline Asset(Forward Renderer)之前有场景文件或者材质球如果丢失出现以下情况。

即可点击Edit > Render Pipeline > Universal Render Pipeline 下的这个功能即可。

它会弹出一个小框选择这个Proceed即可将材质切换回来。

如果还有材质是粉色的那这个时候就需要手动去修改,在丢失的材质下对应的shader下选择标记的这个shader,

在里面选择任意一个即可将材质修改回来,


这就是修改后的效果。如果需要赋图片则在shader里面的Surface Inputs下左边的小框框中拖入要赋值的图片即可后面的白色小格子可以选择要赋值的颜色(可任意修改)。

unity urp 渲染管线顶点偏移的实现

这里我是通过法线对顶点进行偏移

如果面与面之间的点不是公用的,会出现屏幕中立方体的效果,球则没有这个问题。所以使用顶点偏移的时候需要注意一下。
我实现的是在模型空间进行顶点偏移,大家按自己的需求实现

接下来,代码:

Shader "URP/VertexOffset"

    Properties
    
        [MainTexture] _BaseMap ("Albedo", 2D) = "white"  
        [MainColor] _BaseColor ("Color", Color) = (1, 1, 1, 1)
        
        _Cutoff ("Alpha Cutoff", Range(0.0, 1.0)) = 0.5

        _VertexOffset ("顶点偏移", Float) = 0
        
        _Cull ("Cull", Int) = 2

    

    SubShader
    
        Tags  "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" "UniversalMaterialType" = "Lit" "IgnoreProjector" = "True" "ShaderModel" = "4.5" 
        LOD 300

        // ------------------------------------------------------------------
        //  Forward pass. Shades all light in a single pass. GI + emission + Fog
        Pass
        
            Tags  "LightMode" = "UniversalForward" 
            Cull[_Cull]

            HLSLPROGRAM

            #pragma exclude_renderers gles gles3 glcore
            #pragma target 4.5

            //--------------------------------------
            // GPU Instancing
            #pragma multi_compile_instancing
            #pragma instancing_options renderinglayer
            #pragma multi_compile _ DOTS_INSTANCING_ON

            #pragma vertex LitPassVertex
            #pragma fragment LitPassFragment

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            //需要光照系统时增加此引入
            // #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

            struct Attributes
            
                float4 positionOS : POSITION;
                float3 normalOS : NORMAL;
                float4 tangentOS : TANGENT;
                float2 texcoord : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            ;

            struct Varyings
            
                float2 uv : TEXCOORD0;
                float4 positionCS : SV_POSITION;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            ;

            TEXTURE2D(_BaseMap);        SAMPLER(sampler_BaseMap);

            CBUFFER_START(UnityPerMaterial)
            half4 _BaseColor;
            half4 _BaseMap_ST;
            half _Cutoff;
            half4 _BaseMap_ST;
            CBUFFER_END

            // Used in Standard (Physically Based) shader
            Varyings LitPassVertex(Attributes input)
            
                Varyings output = (Varyings)0;

                UNITY_SETUP_INSTANCE_ID(input);
                UNITY_TRANSFER_INSTANCE_ID(input, output);

                //通过法向偏移顶点
                half3 positionOS = input.positionOS;
                positionOS += input.normalOS * _VertexOffset;

                output.positionCS = TransformObjectToHClip(positionOS);
                output.uv = TRANSFORM_TEX(input.texcoord, _BaseMap);

                return output;
            

            half4 LitPassFragment(Varyings input) : SV_Target
            
                UNITY_SETUP_INSTANCE_ID(input);
                //---------------输入数据-----------------
                float2 UV = input.uv;

                half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, input.uv) * _BaseColor;
                clip(color.r - _Cutoff);

                return color;
            
            ENDHLSL

        

    

    FallBack "Hidden/Universal Render Pipeline/FallbackError"


以上是关于unity默认渲染管线切换到URP渲染管线并切换材质的主要内容,如果未能解决你的问题,请参考以下文章

unity渲染管线及升级URP

unity urp 渲染管线顶点偏移的实现

unity urp 渲染管线顶点偏移的实现

Unity URP

[游戏开发]Unity SRP 学习

Unity场景内模型出现粉色的处理方法