找回密码
 立即注册
查看: 406|回复: 1

Unity URP Lit shader自定义阴影颜色

[复制链接]
发表于 2021-12-7 19:55 | 显示全部楼层 |阅读模式
由于需要修改URP实现,首先需要将插件源码移动到Package目录避免被Unity还原。



原URP目录在 Library\PackageCache内,直接剪切即可

1.打开Lit.shader文件,在Properties块内添加可编辑属性
2.shader添加自定义阴影的Keyword
Shader "Universal Render Pipeline/Lit"
{
    Properties
    {
        ····省略····

        [Toggle] _ShadowColCustom("打开阴影颜色自定义", Float) = 0
        _ShadowColor("阴影颜色", Color) = (0,0,0,1)

        ····省略····
    }
    ····省略····
    SubShader
    {
        // ------------------------------------------------------------------
        //  Forward pass. Shades all light in a single pass. GI + emission + Fog
        Pass
        {
            // Lightmode matches the ShaderPassName set in UniversalRenderPipeline.cs. SRPDefaultUnlit and passes with
            // no LightMode tag are also rendered by Universal Render Pipeline
            Name "ForwardLit"
            Tags{"LightMode" = "UniversalForward"}

            Blend[_SrcBlend][_DstBlend]
            ZWrite[_ZWrite]
            Cull[_Cull]

            HLSLPROGRAM
            // -------------------------------------
            // Material Keywords
            #pragma shader_feature_local _SHADOWCOLCUSTOM_ON
         }
     }
}


_SHADOWCOLCUSTOM_ON宏添加进第一个Pass内即可

3.为了支持SRP Batcher,需要将_ShadowColor添加进CBUFFER内,打开LitInput.hlsl源码进行修改


4.在源码中找到阴影部分实现,进行颜色的差值混合


#ifdef _SHADOWCOLCUSTOM_ON
    half3 radiance = lerp(_ShadowColor, lightColor, lightAttenuation * _ShadowColor.a) * NdotL;
#else
    half3 radiance = lightColor * lightAttenuation * NdotL;
#endif由于Lit的属性面板做了自定义,需要修改编辑器面板绘制部分的代码逻辑
1.找到LitShader.cs,找一个位置插入阴影颜色属性的绘制逻辑


private void DrawShadowColorProperties(Material material)
{
    bool customShadowColor = material.IsKeywordEnabled("_SHADOWCOLCUSTOM_ON");

    float viewWidth = EditorGUIUtility.currentViewWidth;
    Rect drawRect = EditorGUILayout.GetControlRect();
    Rect rc = drawRect;
    rc.width = 140;
    EditorGUI.LabelField(rc, "自定义阴影颜色");

    rc.width = viewWidth - 35;
    EditorGUI.BeginChangeCheck();
    customShadowColor = EditorGUI.Toggle(rc, " ", customShadowColor);
    if (EditorGUI.EndChangeCheck())
    {
        EditorUtility.SetDirty(material);
        Undo.RecordObject(material, "");

        material.SetFloat("_ShadowColCustom", customShadowColor ? 1 : 0);

        MaterialChanged(material);
    }
    EditorGUI.BeginDisabledGroup(!customShadowColor);
    {
        drawRect = EditorGUILayout.GetControlRect();

        rc = drawRect;
        rc.width = 140;
        EditorGUI.LabelField(rc, "阴影颜色");

        rc.width = viewWidth - 35;
        EditorGUI.BeginChangeCheck();
        Color fogColor = EditorGUI.ColorField(rc, " ", material.GetColor("_ShadowColor"));
        if (EditorGUI.EndChangeCheck())
        {
            EditorUtility.SetDirty(material);
            Undo.RecordObject(material, "");
            material.SetColor("_ShadowColor", fogColor);
        }
    }
    EditorGUI.EndDisabledGroup();
}2.在BaseShaderGUI.cs内,找到对Keyword的修改逻辑,添加上我们自定义的Keyword处理


bool customShadowColor = false;
if (material.HasProperty("_ShadowColCustom"))
{
    customShadowColor = material.GetFloat("_ShadowColCustom") >= 0.5;
}
if (customShadowColor)
{
    material.EnableKeyword("_SHADOWCOLCUSTOM_ON");
}
else
{
    material.DisableKeyword("_SHADOWCOLCUSTOM_ON");
}
接下来我们回到编辑器,Lit的材质球面板会多出阴影自定义部分的编辑





自定义阴影颜色

到此,可以对物体进行阴影颜色自定义了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-12-7 19:59 | 显示全部楼层
[赞同]
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-25 01:58 , Processed in 0.089993 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表