【问题标题】:Unity shadows ignoring shader's transparency but only in buildUnity 阴影忽略着色器的透明度,但仅在构建中
【发布时间】:2018-10-11 02:38:21
【问题描述】:

我制作了一个自定义着色器,它向表面着色器添加了一个通道,以实现对象周围的轮廓。该对象是一个带有角色精灵的四边形,以在 3d 游戏中实现 2d 角色。该对象应该以与其精灵相同的形状投射阴影。

在编辑器的播放模式下,阴影效果完美:

但是,当我在 windows 或 android 平台上构建游戏时,阴影完全忽略了对象的透明度,只显示了四边形的阴影。

我不确定问题是由我的着色器还是设置中的某些原因引起的。我已将质量设置重置为默认值,即使设置为超质量仍然存在问题。场景中唯一的光源是开启了柔和阴影的定向光源。

这是我的着色器中的代码。

Shader "Custom/MultiPassOutlineShader" {
    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
        _OutlineColor ("Outline Color",Color) = (1,1,1,1)
        _OutlineThickness ("Outline Thickness",float) = 0.05
    }
    SubShader {

        Tags {"RenderType"="Transparent" "Queue"="Transparent" "IgnoreProjector"="True"}
        LOD 100

        Pass
        {
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag alpha
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;

            float4 _MainTex_ST;
            float _OutlineThickness;
            fixed4 _OutlineColor;

            v2f vert (appdata v)
            {
                v2f o;
                v.vertex = normalize(v.vertex) * _OutlineThickness + v.vertex;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {

                UNITY_APPLY_FOG(i.fogCoord, col);
                fixed4 c = tex2D (_MainTex, i.uv);
                fixed4 col = _OutlineColor;
                col.a *= c.a;
                clip(c.a-0.1);
                return col;
            }
            ENDCG
        }

        ZWrite On
        Blend Off
        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows alpha
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
        // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
         #pragma instancing_options assumeuniformscaling
        UNITY_INSTANCING_CBUFFER_START(Props)
            // put more per-instance properties here
        UNITY_INSTANCING_CBUFFER_END

        void surf (Input IN, inout SurfaceOutputStandard o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            clip(c.a - 0.9);
            o.Albedo = c.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Standard"
}

【问题讨论】:

  • 进入File->BuildSettings->PlayerSettings->OtherSettings->Rendering,查看是否开启了静态批处理等功能。
  • 静态批处理和动态批处理都进行了检查。我将播放器设置重置为默认值,并尝试了这两个复选框的每种组合。什么也没有变。我觉得这个问题可能与我的着色器中的 Fallback 语句有关。

标签: unity3d shader shadow


【解决方案1】:

我通过添加阴影投射通道解决了这个问题。 (出于某种原因,统一没有关于这些的文档。)我还将后备更改为“VertexLit”,但我不知道这是否有任何影响。我仍然不知道为什么编辑器中的阴影形状与构建中的不同。

    //From https://answers.unity.com/questions/1003169/shadow-caster-shader.html
    Pass{ 
        Name "ShadowCaster"
        Tags { "LightMode" = "ShadowCaster" }

        Fog {Mode Off}
        ZWrite On ZTest Less Cull Off
        Offset 1, 1

        CGPROGRAM

        #pragma vertex vert
        #pragma fragment frag
        #pragma fragmentoption ARB_precision_hint_fastest
        #pragma multi_compile_shadowcaster
        #include "UnityCG.cginc"

        sampler2D _MainTex;

        struct v2f
        {
            V2F_SHADOW_CASTER; 
            float2 uv : TEXCOORD1;
        };


        v2f vert(appdata_full v )
        {
            v2f o;
            o.uv = v.texcoord;
            TRANSFER_SHADOW_CASTER(o)

        return o;
        }

        float4 frag( v2f i ) : COLOR
        {
            fixed4 c = tex2D (_MainTex, i.uv);
            clip(c.a - 0.9);
            SHADOW_CASTER_FRAGMENT(i)
        }
        ENDCG
    } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 2018-02-13
    • 2012-07-17
    相关资源
    最近更新 更多