文章目录
前言
材质丢失?为啥我们的模型材质显示粉色?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是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~