【unity小技巧】unity普通项目升级为URP项目技巧且如何解决导入unity的模型材质显示粉色或者紫色问题

前言

材质丢失?为啥我们的模型材质显示粉色?unity普通项目如何升级为URP项目?

其实升级URP我之前文章已经做过很多次了,但是无奈还是有很多人不会操作,所以我这里单独提出来说一下

一、什么是LWRP(轻量级渲染管线)、URP(通用渲染管线)和HDRP(高清晰度渲染管线)

在Unity中,他们都是渲染管线,它们的主要区别在于性能和功能。

LWRP是早期版本的URP,它专门为移动设备和低端PC设计,旨在提供更高的性能。它使用基于顶点的光照和简化的后处理效果,可以在更低的硬件要求下运行。LWRP还支持自定义渲染管线,但功能比URP少。

URP是Unity的默认渲染管线,它旨在提供高性能的渲染,适用于移动设备和低端PC。它使用基于物理的渲染(PBR)和后处理效果,可以在不牺牲质量的情况下提高性能。URP还支持SRP扩展,可以自定义渲染管线以满足特定需求。

HDRP(高清晰度渲染管线)是另一种渲染管线,与URP和LWRP不同,它旨在提供高质量的渲染效果,适用于高端PC和游戏主机。它使用基于物理的渲染(PBR)和高级后处理效果,可以实现更逼真的光照和阴影效果。HDRP也支持SRP扩展,可以自定义渲染管线以满足特定需求。

总的来说,LWRP、URP和HDRP都是为了提高性能而设计的渲染管线。与URP和LWRP相比,HDRP需要更高的硬件要求,但可以实现更高质量的渲染效果。如果您的项目需要更高质量的渲染效果,那么HDRP可能是更好的选择。如果您的项目需要更高的性能和更广泛的设备支持,则应该选择URP或LWRP。LWRP则更适合低端设备,URP具有更多的功能和更高的质量。

二、新建项目

这里可以直接创建HDRP或者URP项目
这里我创建一个默认的3D项目,演示一下如何把项目升级到URP
注意我使用的是unity 2021.3版本
在这里插入图片描述

三、导入素材

这里我导入的是免费的Low-Poly Simple Nature Pack素材
https://assetstore.unity.com/packages/3d/environments/landscapes/low-poly-simple-nature-pack-162153
在这里插入图片描述
当然你也可以选择其他的素材,不过要注意查看素材是否支持URP
在这里插入图片描述

四、升级URP

打开包管理器,安装URP
在这里插入图片描述
右键创建一个URP的配置
在这里插入图片描述
然后我们再打开项目设置(Project Settings),绑定URP配置
在这里插入图片描述

五、升级为URP材质

现在这些材质就丢失了,因为我们已经把管线切换成了URP,所以原来的Shader文件就不能用了
选择窗口-》渲染-》渲染管线转换器,把所有素材升级为URP
在这里插入图片描述
选择URP把下面的Material Upgrade材料升级勾选,,再点击Initialize And Convert初始化和转换
在这里插入图片描述
可以看到我们的素材就恢复正常了
在这里插入图片描述

六、选中某些材质升级为URP

在这里插入图片描述
ps:可能你会发现材质转换了还是粉色,虽然看着还是粉色,但是其实已经转换成功了,这是unity的一个bug

七、如果我的材质本身不支持URP,但是想要升级URP怎么办?

如果按前面的步骤,升级URP材质还是有一部分模型一样显示为粉色或者紫色,那么说明它们使用了自定义shader材质,且它们本身并不支持URP
在这里插入图片描述
可以通过手动去修改有问题的材质,一般直接换成URP里的Lit材质就可以了。
在这里插入图片描述
如果效果不行,我们可以自己添加材质shader实现,比如:

Shader "URP/AlphaTestWithBothSide"
{
    Properties
    {
        _Color ("Color Tint", Color) = (1, 1, 1, 1)
        _MainTex ("Main Tex", 2D) = "white" { }
        _Cutoff ("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
    }
    SubShader
    {
        //      指定渲染通道使用URP渲染管线                     渲染队列 = 透明度测试       忽略投影                    渲染类型 = 透明镂空
        Tags { "RenderPipeline" = "UniversalRenderPipeline" "Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }
        
        Pass
        {
            Tags { "LightMode" = "UniversalForward" }
            
            // 关闭渲染剔除
            Cull Off
            
            HLSLPROGRAM
            
            #pragma vertex vert
            #pragma fragment frag

            // 引用URP函数库
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"
            
            // 声明纹理
            TEXTURE2D(_MainTex);
            // 声明采样器
            SAMPLER(sampler_MainTex);
            
            CBUFFER_START(UnityPerMaterial)
            half4 _Color;
            float4 _MainTex_ST;
            half _Cutoff;
            CBUFFER_END
            
            struct a2v
            {
                float4 vertex: POSITION;
                float3 normal: NORMAL;
                float4 texcoord: TEXCOORD0;
            };
            
            struct v2f
            {
                float4 pos: SV_POSITION;
                float3 worldNormal: TEXCOORD0;
                float3 worldPos: TEXCOORD1;
                float2 uv: TEXCOORD2;         
            };
            
            v2f vert(a2v v)
            {
                v2f o;
                // 初始化变量
                ZERO_INITIALIZE(v2f, o);
                
                o.pos = TransformObjectToHClip(v.vertex.xyz);
                
                o.worldNormal = TransformObjectToWorldNormal(v.normal);
                
                o.worldPos = TransformObjectToWorld(v.vertex.xyz);
                
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
          
                return o;
            }
            
            half4 frag(v2f i): SV_Target
            {
                half3 worldNormal = normalize(i.worldNormal);
                half3 worldLightDir = normalize(TransformObjectToWorldDir(_MainLightPosition.xyz));
                
                half4 texColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
                // 使用clip函数剔除透明像素
                clip(texColor.a - _Cutoff);
                
                half3 albedo = texColor.rgb * _Color.rgb;
                
                half3 ambient = _GlossyEnvironmentColor * albedo;
                
                half3 diffuse = _MainLightColor.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
                
                
                return half4(ambient + diffuse, 1.0);
            }
            
            ENDHLSL
            
        }
    }
    FallBack "Packages/com.unity.render-pipelines.universal/SimpleLit"
}

在这里插入图片描述
如果想实现二次元效果,可以参考:【实现100个unity特效之25】Unity中实现二次元模型,基于光照的内置和URP管线卡通化渲染shader

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向宇it

创作不易,感谢你的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值