自定义着色器铸造阴影,但无法接收它们

发布于 2025-02-02 14:18:15 字数 3101 浏览 5 评论 0原文

当我的2D精灵从平坦的飞机上“站起来” 10度时,我有两个着色器供我的2D Sprites铸造阴影。

这是铸造并接收阴影,但是我无法使用alpha通道,透明度完全忽略了

    Shader "Custom/SpriteShadow" 
{
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        [PerRendererData]_MainTex ("Sprite Texture", 2D) = "white" {}
        _Cutoff("Shadow alpha cutoff", Range(0,1)) = 0.5
    }
    SubShader {
        Tags 
        { 
            "Queue"="Geometry"
            "RenderType"="TransparentCutout"
        }
        LOD 200

        Cull Off

        CGPROGRAM
        // Lambert lighting model, and enable shadows on all light types
        #pragma surface surf Lambert addshadow fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;
        fixed4 _Color;
        fixed _Cutoff;

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
            clip(o.Alpha - _Cutoff);
        }
        ENDCG
    }
    FallBack "Diffuse"
}

第二个着色器可以抛弃阴影并以alpha/透明的作用,但无法接收阴影。

Shader "Custom/SpriteShadowWithAlpha"{
    Properties
    {
        [PerRendererData] _MainTex("Texture", 2D) = "white" {}  
        _EffectColor1("Effect Color", Color) = (1,1,1,1)
        _Crossfade("Fade", float) = 0
        _FlashColor("Flash Color", Color) = (1,1,1,1)
        _FlashAmount("Flash Amount",Range(0.0,1.0)) = 0
        _Cutoff("Alpha Cutoff", Range(0,1)) = 0.9
        _Color ("Color", Color) = (1,1,1,1)
    [Toggle(_ALPHABLEND_ON)] ALPHABLEND_ON("Enable Dithered Shadows", Float) = 0.0
 
 
    }
    SubShader
    {
        Tags
        {
            "Queue" = "Transparent"
            "IgnoreProjector" = "True"
            "RenderType" = "TransparentCutOut"
            "PreviewType" = "Plane"
            "CanUseSpriteAtlas" = "True"
        }
 
        Cull Off
        Lighting Off
        ZWrite Off
        Blend SrcAlpha OneMinusSrcAlpha
        CGPROGRAM
            #pragma surface surf Lambert alpha:blend fullforwardshadows alphatest:_Cutoff
            #pragma target 3.0
 
            struct Input {
                fixed2 uv_MainTex;
                fixed4 color : COLOR;
            };
            sampler2D _MainTex;
            fixed4 _EffectColor1;
            fixed _Crossfade;
            fixed4 _FlashColor;
            float _FlashAmount;
            void surf(Input IN, inout SurfaceOutput o)
            {
                fixed4 col = tex2D(_MainTex, IN.uv_MainTex);
                fixed4 returnColor = lerp(col, col * _EffectColor1, _Crossfade) * _EffectColor1.a + col * (1.0 - _EffectColor1.a);
                o.Albedo = returnColor.rgb * IN.color.rgb;
                o.Alpha = col.a * IN.color.a;
                o.Albedo = lerp(o.Albedo,_FlashColor.rgb,_FlashAmount);
         
            }
        ENDCG
    }
    Fallback "Standard"
}

我曾尝试过混合和匹配两个部分的不同部分,但永远无法吸引阴影来铸造和接收和使用Alpha频道。

I have two shaders for my 2d sprites to cast shadows when they are "stood up" 10 degrees off a flat plane.

This one casts and receives shadows, but I cannot use the alpha channel, transparency is entirely ignored

    Shader "Custom/SpriteShadow" 
{
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        [PerRendererData]_MainTex ("Sprite Texture", 2D) = "white" {}
        _Cutoff("Shadow alpha cutoff", Range(0,1)) = 0.5
    }
    SubShader {
        Tags 
        { 
            "Queue"="Geometry"
            "RenderType"="TransparentCutout"
        }
        LOD 200

        Cull Off

        CGPROGRAM
        // Lambert lighting model, and enable shadows on all light types
        #pragma surface surf Lambert addshadow fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;
        fixed4 _Color;
        fixed _Cutoff;

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
            clip(o.Alpha - _Cutoff);
        }
        ENDCG
    }
    FallBack "Diffuse"
}

The second shader can cast shadows and works with alpha/transparency, but cannot receive shadows.

Shader "Custom/SpriteShadowWithAlpha"{
    Properties
    {
        [PerRendererData] _MainTex("Texture", 2D) = "white" {}  
        _EffectColor1("Effect Color", Color) = (1,1,1,1)
        _Crossfade("Fade", float) = 0
        _FlashColor("Flash Color", Color) = (1,1,1,1)
        _FlashAmount("Flash Amount",Range(0.0,1.0)) = 0
        _Cutoff("Alpha Cutoff", Range(0,1)) = 0.9
        _Color ("Color", Color) = (1,1,1,1)
    [Toggle(_ALPHABLEND_ON)] ALPHABLEND_ON("Enable Dithered Shadows", Float) = 0.0
 
 
    }
    SubShader
    {
        Tags
        {
            "Queue" = "Transparent"
            "IgnoreProjector" = "True"
            "RenderType" = "TransparentCutOut"
            "PreviewType" = "Plane"
            "CanUseSpriteAtlas" = "True"
        }
 
        Cull Off
        Lighting Off
        ZWrite Off
        Blend SrcAlpha OneMinusSrcAlpha
        CGPROGRAM
            #pragma surface surf Lambert alpha:blend fullforwardshadows alphatest:_Cutoff
            #pragma target 3.0
 
            struct Input {
                fixed2 uv_MainTex;
                fixed4 color : COLOR;
            };
            sampler2D _MainTex;
            fixed4 _EffectColor1;
            fixed _Crossfade;
            fixed4 _FlashColor;
            float _FlashAmount;
            void surf(Input IN, inout SurfaceOutput o)
            {
                fixed4 col = tex2D(_MainTex, IN.uv_MainTex);
                fixed4 returnColor = lerp(col, col * _EffectColor1, _Crossfade) * _EffectColor1.a + col * (1.0 - _EffectColor1.a);
                o.Albedo = returnColor.rgb * IN.color.rgb;
                o.Alpha = col.a * IN.color.a;
                o.Albedo = lerp(o.Albedo,_FlashColor.rgb,_FlashAmount);
         
            }
        ENDCG
    }
    Fallback "Standard"
}

I have tried mixing and matching different parts of the two but can never get shadows to cast and receive and work with the alpha channel.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

放飞的风筝 2025-02-09 14:18:15

这可能不是将来任何人都希望看到的答案,但这是我和那个的答案。最初,我无法找出一个URP着色器来完成我想做的事情。但是,我能够找到适合我以后需求的人。

因此,我的解决方案是升级到URP并抛弃标准着色器。使用以下视频作为指南和着色器源
https://www.youtube.com/watch?v = d_objv7c1cy

This may not be the answer anyone in the future wants to see, but it is the one I went with. Originally I was unable to figure out a URP shader to do what I wanted. I was however able to find one that suited my needs later on.

So my solution was to upgrade to URP and ditch the standard shader. Using the following video as a guide and shader source
https://www.youtube.com/watch?v=d_OBjV7c1CY

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文