同一Shader在不同Unity URP项目中表现不一致问题求助
自定义Lambert光照Shader在URP项目中显示黑色的排查问题
我正在学习基础Lambert光照模型Shader,编写的代码如下:
Shader "Unlit/NewUnlitShader" { Properties{ _MainColor("MainColor",Color)=(1,1,1,1) } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "UnityLightingCommon.cginc" struct v2f { float4 pos:SV_POSITION; fixed4 dif:COLOR0; }; fixed4 _MainColor; v2f vert(appdata_base v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); //normal vector float3 n = UnityObjectToWorldNormal(v.normal); n=normalize(n); //lighting direction vector fixed3 l = normalize(_WorldSpaceLightPos0.xyz); //calculate lambert fixed ndotl = dot(n,l); o.dif = _LightColor0*_MainColor*saturate(ndotl); return o; } fixed4 frag(v2f i):SV_Target { return i.dif; } ENDCG } } }
出现异常情况:在原有URP项目中,使用该Shader创建材质并赋予球体后,球体始终显示为黑色(左侧为URP/Lit材质效果,右侧为自定义Shader材质,预览图呈黑色);但在新建并安装URP的项目中,复制该Shader后却能正常运行。推测是原有项目存在错误设置,恳请协助排查原因。
排查步骤:
检查URP管线的光照兼容性设置
打开Project Settings -> Graphics,找到当前使用的URP Asset,进入Rendering Settings面板,确认Lighting Compatibility下的相关选项已勾选(比如Forward Compatibility),确保URP允许访问_WorldSpaceLightPos0、_LightColor0这类内置管线光照变量。验证场景光照配置
打开Window -> Rendering -> Lighting Settings:- 确认场景内有至少一个启用的Directional Light作为主光源,且其Lighting Mode设置为Realtime或Mixed
- 检查Realtime Lighting选项处于启用状态,未勾选"Disable Baked Lighting"
给Shader添加URP兼容标签
你的Shader没有声明适配URP,原有项目可能未将其识别为URP Shader。在SubShader块中添加URP标签:SubShader { Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" } Pass { // 原有Pass内容 } }检查材质的渲染管线归属
选中自定义材质,在Inspector顶部确认Render Pipeline选项为Universal Render Pipeline,避免材质使用内置管线模式加载。清除缓存并重新编译/生成光照
- 右键点击Shader文件选择Reimport,重新编译Shader
- 在Lighting Settings面板点击Generate Lighting,重新生成场景光照数据
- 选择Edit -> Clear All Player Preferences后重启Unity,清除项目缓存
内容的提问来源于stack exchange,提问作者ConnonsWonderland
相关产品推荐
相关产品推荐

