Unity默认渲染管线改URP,Unity内置渲染管线升级URP教程

最近做的一个足球项目,需要把场景做得精细,从默认管线改成了urp渲染管线,期间有部分材质是兼容不了urp管线,查阅了很多资料,有的用到插件进行转换物体,在替换材质比较麻烦,尝试一下就放弃了,可能我找的插件不会使用,有的是改材质直接替换unity现有支持urp渲染的材质,这个方法是可行的,不过用unity自带支持的渲染管线shader有的时候材质渲染出来的效果不是很好,我用了自己查阅到的第三种,写shader脚本,支持urp渲染。

比较通用的shader脚本,支持贴上一张纹理图片的材质如下:

如果有的对象是多个一张纹理材质构造而成的可以使用这个shader脚本可以在urp进行渲染出来。以下是脚本:

Shader "Custom/Diffuse_URP"
{
    // Properties用于在Unity编辑器中公开变量,使得无需更改Shader代码就可以修改它们。
    Properties
    {
        // 主要纹理属性,默认值为白色。
        _MainTex ("Texture", 2D) = "white" {}
        // 颜色属性,默认值为白色(RGBA: 1, 1, 1, 1)。
        _Color ("Color", Color) = (1, 1, 1, 1)
    }

    // SubShader包含将由GPU使用的实际Shader代码。
    SubShader
    {
        // Tags标签用于指定渲染管线和渲染队列。
        Tags
        {
            // 指定该Shader使用通用渲染管线(URP)。
            "RenderPipeline" = "UniversalPipeline"
            // 指定该Shader在几何渲染队列中进行渲染。
            "Queue" = "Geometry"
        }

        // Pass定义了渲染时的具体操作。
        Pass
        {
            // 指定渲染通道的名称。
            Name "UniversalForward"
            // Tags标签用于指定光照模式。
            Tags
            {
                // 指定该Pass使用通用前向渲染。
                "LightMode" = "UniversalForward"
            }

            // CGPROGRAM块包含实际的Shader代码。
            CGPROGRAM
            // 指定顶点着色器的入口点。
            #pragma vertex vert
            // 指定片段着色器的入口点。
            #pragma fragment frag

            // 包含Unity内置的CG库。
            #include "UnityCG.cginc"

            // 定义顶点着色器的输入结构。
            struct appdata
            {
                float4 vertex : POSITION; // 顶点位置
                float2 uv : TEXCOORD0; // 纹理坐标
            };

            // 定义从顶点着色器传递到片段着色器的数据结构。
            struct v2f
            {
                float2 uv : TEXCOORD0; // 纹理坐标
                UNITY_FOG_COORDS(1) // 雾坐标
                float4 vertex : SV_POSITION; // 裁剪空间中的顶点位置
            };

            // 定义Shader中的颜色属性变量。
            fixed4 _Color;
            // 定义Shader中的纹理采样器变量。
            sampler2D _MainTex;

            // 顶点着色器
            v2f vert (appdata v)
            {
                v2f o;
                // 将物体空间中的顶点位置转换为裁剪空间位置。
                o.vertex = UnityObjectToClipPos(v.vertex);
                // 传递纹理坐标。
                o.uv = v.uv;
                // 传递雾坐标。
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            // 片段着色器
            fixed4 frag (v2f i) : SV_Target
            {
                // 采样纹理并乘以颜色属性。
                fixed4 col = tex2D(_MainTex, i.uv) * _Color;
                // 应用雾效果。
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            // 结束CG代码块。
            ENDCG
        }
    }

    // 指定该Shader的回退Shader。
    Fallback "Diffuse"
}

如果物体对象身上有需要贴两张纹理图片的shader材质,如下:

则shader脚本使用以下的代码:

Shader "Custom/DecalUV2_URP"
{
    // Properties用于在Unity编辑器中公开变量,使得无需更改Shader代码就可以修改它们。
    Properties
    {
        // 主要颜色属性,默认值为白色(RGBA: 1, 1, 1, 1)。
        _Color ("Main Color", Color) = (1, 1, 1, 1)
        // 贴花颜色属性,默认值为白色(RGBA: 1, 1, 1, 1)。
        _DecalColor ("Decal Color", Color) = (1, 1, 1, 1)
        // 基础纹理属性,默认值为白色。
        _MainTex ("Base (RGB)", 2D) = "white" {}
        // 贴花纹理属性,默认值为黑色。
        _DecalTex ("Decal (RGBA)", 2D) = "black" {}
    }

    // SubShader包含将由GPU使用的实际Shader代码。
    SubShader
    {
        // Tags标签用于指定渲染管线和渲染队列。
        Tags
        {
            // 指定该Shader使用通用渲染管线(URP)。
            "RenderPipeline" = "UniversalPipeline"
            // 指定该Shader在透明渲染队列中进行渲染。
            "Queue" = "Transparent"
            // 指定渲染类型为透明。
            "RenderType" = "Transparent"
        }
        // 指定该Shader的LOD(细节级别)。
        LOD 250

        // Pass定义了渲染时的具体操作。
        Pass
        {
            // 指定渲染通道的名称。
            Name "ForwardLit"
            // Tags标签用于指定光照模式。
            Tags { "LightMode" = "UniversalForward" }

            // HLSLPROGRAM块包含实际的Shader代码。
            HLSLPROGRAM
            // 指定顶点着色器的入口点。
            #pragma vertex vert
            // 指定片段着色器的入口点。
            #pragma fragment frag
            // 包含通用渲染管线的核心HLSL库。
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            // 包含通用渲染管线的光照HLSL库。
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

            // 定义顶点着色器的输入结构。
            struct Attributes
            {
                float4 positionOS : POSITION; // 物体空间中的顶点位置
                float2 uv : TEXCOORD0; // 纹理坐标
                float2 uv2 : TEXCOORD1; // 第二组纹理坐标
            };

            // 定义从顶点着色器传递到片段着色器的数据结构。
            struct Varyings
            {
                float4 positionHCS : SV_POSITION; // 裁剪空间中的顶点位置
                float2 uv : TEXCOORD0; // 纹理坐标
                float2 uv2 : TEXCOORD1; // 第二组纹理坐标
                float4 color : COLOR; // 顶点颜色
            };

            // 定义Shader中的纹理采样器变量。
            sampler2D _MainTex;
            sampler2D _DecalTex;
            // 定义Shader中的颜色属性变量。
            float4 _Color;
            float4 _DecalColor;

            // 顶点着色器
            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                // 将物体空间中的顶点位置转换为裁剪空间位置。
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS);
                // 传递纹理坐标。
                OUT.uv = IN.uv;
                // 传递第二组纹理坐标。
                OUT.uv2 = IN.uv2;
                return OUT;
            }

            // 片段着色器
            half4 frag(Varyings IN) : SV_Target
            {
                // 采样基础纹理并乘以颜色属性。
                half4 baseColor = tex2D(_MainTex, IN.uv) * _Color;
                // 采样贴花纹理并乘以贴花颜色属性。
                half4 decalColor = tex2D(_DecalTex, IN.uv2) * _DecalColor;
                // 使用贴花的alpha值在基础颜色和贴花颜色之间进行线性插值。
                half3 finalColor = lerp(baseColor.rgb, decalColor.rgb, decalColor.a);
                // 返回最终颜色,保持基础颜色的alpha值。
                return half4(finalColor, baseColor.a);
            }
            // 结束HLSL代码块。
            ENDHLSL
        }
    }

    // 指定该Shader的回退Shader。
    Fallback "Diffuse"
}

上面写到的shader脚本只支持urp渲染,分别为支持一张纹理贴图和两张纹理贴图的urp渲染,如果渲染出来的效果跟预想不一样,可能需要考虑灯光、着色器、场景因素等,进行自行改动,因为本身shader脚本的渲染如果能被渲染出来非粉红色就没有问题,问题出在环境方面,有的环境灯光用的不同,着色器等等方面

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值