You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:45:16