Unity创建标准Surface Shader后材质呈粉紫色的修复咨询
解决URP项目中Standard Surface Shader显示粉紫色的问题
你的核心问题是URP渲染管线不兼容内置渲染管线的Standard Surface Shader——虽然Unity没有抛出报错,但这类Shader在URP环境下无法正常编译运行,最终会显示粉紫色(Shader失效的默认提示色)。以下是具体解决方法:
方法1:直接使用URP官方Shader模板
在Unity中创建Shader时,不要选择内置的Lit/Standard Surface Shader,而是选Universal Render Pipeline分类下的Lit模板。这个模板原生适配URP,创建后无需额外修改就能正常使用,属性和你原来的Shader基本对应。
方法2:修改现有Shader适配URP
如果想基于现有代码调整,需要把内置的Surface Shader语法改成URP兼容的HLSL写法,示例如下:
Shader "Custom/URPTestShader" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 } SubShader { Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" } LOD 200 Pass { HLSLPROGRAM #pragma vertex vert #pragma fragment frag #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; float2 uv_MainTex : TEXCOORD0; float3 normalOS : NORMAL; }; struct Varyings { float2 uv_MainTex : TEXCOORD0; float3 normalWS : TEXCOORD1; float4 positionHCS : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; half _Glossiness; half _Metallic; fixed4 _Color; Varyings vert(Attributes input) { Varyings output; output.positionHCS = TransformObjectToHClip(input.positionOS.xyz); output.uv_MainTex = TRANSFORM_TEX(input.uv_MainTex, _MainTex); output.normalWS = TransformObjectToWorldNormal(input.normalOS); return output; } half4 frag(Varyings input) : SV_Target { half4 albedoTex = tex2D(_MainTex, input.uv_MainTex) * _Color; half3 albedo = albedoTex.rgb; half metallic = _Metallic; half smoothness = _Glossiness; Light mainLight = GetMainLight(); half3 normalWS = normalize(input.normalWS); half3 viewDirWS = normalize(_WorldSpaceCameraPos - input.positionHCS.xyz); // 基础PBR光照计算(基于URP内置函数) half3 diffuse = albedo * mainLight.color * saturate(dot(normalWS, mainLight.direction)); half3 specular = SpecularStrength(metallic, smoothness) * mainLight.color * pow(saturate(dot(reflect(-mainLight.direction, normalWS), viewDirWS)), 10 * smoothness); half3 color = diffuse + specular; return half4(color, albedoTex.a); } ENDHLSL } } FallBack "Universal Render Pipeline/Lit" }
方法3:临时修复Fallback(不推荐长期使用)
如果只是临时测试,可以把原Shader的FallBack "Diffuse"改成FallBack "Universal Render Pipeline/Lit"——这样Shader失效时会 fallback 到URP的Lit Shader,不会显示粉紫色,但这只是权宜之计,核心还是要使用URP兼容的Shader写法。
额外排查点
- 确认材质的Shader选择正确,没有误选内置渲染管线的Shader;
- 再次核对URP的Scriptable Render Pipeline资源配置是否正确;
- 确保
com.unity.render-pipelines.universal包的版本与Unity版本兼容。
内容的提问来源于stack exchange,提问作者Lilly
相关产品推荐
相关产品推荐

