最近做的一个足球项目,需要把场景做得精细,从默认管线改成了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脚本的渲染如果能被渲染出来非粉红色就没有问题,问题出在环境方面,有的环境灯光用的不同,着色器等等方面