Добавьте поддержку освещения в спрайт шейдер - PullRequest
0 голосов
/ 19 марта 2019

Как добавить поддержку освещения в существующий спрайт-шейдер? Теперь шейдер работает как «Sprites / Default», но должен работать как «Sprites / Diffuse». Другими словами, текущий шейдер не реагирует на источники света, необходимо добавить ответ на освещение в реальном времени.

Shader "Sprites/Stencil Mask"
{
 Properties
 {
     [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
     _Color ("Tint", Color) = (1,1,1,1)
     [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
 }

 SubShader
 {
     Tags
     {
         "Queue"="Transparent"
         "IgnoreProjector"="True"
         "RenderType"="Transparent"
         "PreviewType"="Plane"
         "CanUseSpriteAtlas"="True"
     }

     Cull Off
     Lighting Off
     ZWrite Off
     Fog { Mode Off }
     Blend One OneMinusSrcAlpha

     Pass
     {
         Stencil
         {
             Ref 1
             Comp always
             Pass replace
         }

     CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag
         #pragma multi_compile DUMMY PIXELSNAP_ON
         #include "UnityCG.cginc"

         struct appdata_t
         {
             float4 vertex   : POSITION;
             float4 color    : COLOR;
             float2 texcoord : TEXCOORD0;
         };

         struct v2f
         {
             float4 vertex   : SV_POSITION;
             fixed4 color    : COLOR;
             half2 texcoord  : TEXCOORD0;
         };

         fixed4 _Color;

         v2f vert(appdata_t IN)
         {
             v2f OUT;
             OUT.vertex = UnityObjectToClipPos(IN.vertex);
             OUT.texcoord = IN.texcoord;
             OUT.color = IN.color * _Color;
             #ifdef PIXELSNAP_ON
             OUT.vertex = UnityPixelSnap (OUT.vertex);
             #endif

             return OUT;
         }

         sampler2D _MainTex;

         fixed4 frag(v2f IN) : SV_Target
         {
             fixed4 c = tex2D(_MainTex, IN.texcoord) * IN.color;
             if (c.a<0.1) discard;
             c.rgb *= c.a;
             return c;
         }
     ENDCG
     }
 }
}

Скрипт не позволяет мне отправить вопрос из-за недостаточного описания проблемы, но я написал всю необходимую информацию и добавить больше нечего. По этой причине я пишу этот текст внизу вопроса. Я прошу прощения.

1 Ответ

1 голос
/ 26 марта 2019

Если вы просто хотите использовать глобальное освещение / рассеянный свет, вы можете использовать ShadeSH9, который дает вам вклад света, рассчитанный по сферическим гармоникам.Это также даст вам поддержку для световых зондов.

// Add float3 ambient : TEXCOORD1; to your appdata struct and use it to pass SH data
OUT.ambient = ShadeSH9(mul(unity_ObjectToWorld, float4(v.normal, 0.0 )));

Эта функция использует нормаль мира спрайта для вычисления угла входящего света - это может быть не то, что вы хотите, но опять же, естьнет способа отбора сферических гармоник без нормальных.

Вы можете использовать его для подкрашивания спрайта в функции фрагмента следующим образом:

c.rgb *= IN.ambient;

Если вы обнаружите, что вам нужны источники света на основе ослабления, я могу отослать вас к шейдеру вэтот ответ, в котором добавлена ​​поддержка 4 вершинных источников света, не зависящих от нормального:

Unity 3d Sprite Shader (Как ограничить максимальную яркость до 1 при попадании нескольких источников света)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...