Как получить тени на анимированном объекте Оптимизируйте способ?

Я пытаюсь добавить тень к моему флагову, который анимирован. В моем вершинном шейдере, но после добавления тени моя тень исправлена ​​и не следует анимации флага.

для добавления тени я использую ниже ссылку:

  

Diffuse имеет откат вершины, которая содержит в себе два прохода; Shadow Caster и теневой приемник. Это два прохода, которые позволяют шейдеру отображать и получать тени.    http://polycount.com/discussion/131260 /как к GET-пользовательским-шейдерам-к-ПРИЕЙ-тень

 анимирует флаг, но тень фиксирована

мой шейдер находится здесь:

Shader "Custom/Flag" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Speed ("Speed", Range(0, 5.0)) = 1
        _Frequency ("Frequency", Range(0, 1.3)) = 1
        _Amplitude ("Amplitude", Range(0, 5.0)) = 1
    }
    SubShader {
        Tags { "RenderType"="Opaque" "LightMode"="ForwardBase"  }
        Cull off

        Pass {

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase 

            #include "UnityCG.cginc"
            #include "AutoLight.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;

            struct v2f {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                LIGHTING_COORDS(1, 2)
            };

            float _Speed;
            float _Frequency;
            float _Amplitude;

            v2f vert(appdata_base v)
            {
                v2f o;
                v.vertex.y +=  cos((v.vertex.x + _Time.y * _Speed) * _Frequency) * _Amplitude * (v.vertex.x - 5);
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                TRANSFER_VERTEX_TO_FRAGMENT(o);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                return tex2D(_MainTex, i.uv);
            }

            ENDCG

        }
    }
    FallBack "VertexLit"
}

Наконец, я использую "LightMode"="ShadowCaster", но этот тег запрещает отображение моего флага как эта проблема . Мне пришло в голову, что правильно работает , используя два прохода для реализации теней: 1 .normal pass 2.ShadowCaster pass ", но я думаю, что он не оптимизирован.

 введите описание изображения здесь>> </a> </p>

<p> это мое решение как псевдокод: </p>

<pre><code>---- +: = 2 = + ----</code></pre>

<p> <a href= Флаг shader.unitypackage

Короче, я нахожу способ добавления теней для анимированных объектов вершин Оптимизированным способом.

4 голоса | спросил Seyed Morteza Kamali 29 J0000006Europe/Moscow 2017, 16:24:53

1 ответ


1

Система с двумя проходами является единственным способом. Это то, как движок обрабатывает тени.

Вот пример теневого прохода из руководства единицы. Вам нужно будет изменить вершинный шейдер shadow pass.

    // shadow caster rendering pass, implemented manually
    // using macros from UnityCG.cginc
    Pass
    {
        Tags {"LightMode"="ShadowCaster"}

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

        struct v2f { 
            V2F_SHADOW_CASTER;
        };

        v2f vert(appdata_base v)
        {
            v2f o;
            TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
            return o;
        }

        float4 frag(v2f i) : SV_Target
        {
            SHADOW_CASTER_FRAGMENT(i)
        }
        ENDCG
    }
ответил Zebraman 29 J0000006Europe/Moscow 2017, 18:01:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132