Как отредактировать шейдер, чтобы он отображал спрайты без света? - PullRequest
0 голосов
/ 02 февраля 2019

В Интернете я нашел какой-то шейдер, который создает эффект радиального размытия для вращающихся объектов.Он работает и выглядит довольно круто, но когда я применяю его к спрайту, он работает как шейдер Sprite / Diffuse: ему нужен источник света, чтобы быть видимым, в противном случае он черный.

Как я могу отредактировать этот шейдер назаставить его работать как обычный шейдер Sprite / Default, которому не нужен свет?

Вот код:

  Shader "Custom/SpinBlur"{
  Properties{
      _Color("Main Color", Color) = (1,1,1,1)
      _Samples("Samples", Range(0,360)) = 100
      _Angle("Angle", Range(0,360)) = 10
      _MainTex("Color (RGB) Alpha (A)", 2D) = "white"
  }
  SubShader{
  Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" }

  LOD 200
  Cull Off

  CGPROGRAM
  #pragma target 3.0
  #pragma surface surf Lambert alpha

  sampler2D _MainTex;
  int _Angle;
  int _Samples;
  float4 _Color;

  struct Input {
      float2 uv_MainTex;
      float4 screenPos;
  };

  float2 rotateUV(float2 uv, float degrees) {
      const float Deg2Rad = (UNITY_PI * 2.0) / 360.0;
      float rotationRadians = degrees * Deg2Rad;
      float s = sin(rotationRadians);
      float c = cos(rotationRadians);
      float2x2 rotationMatrix = float2x2(c, -s, s, c);
      uv -= 0.5;
      uv = mul(rotationMatrix, uv);
      uv += 0.5;
      return uv;
  }

  void surf(Input IN, inout SurfaceOutput o) {
      const float Deg2Rad = (UNITY_PI * 2.0) / 360.0;
      const float Rad2Deg = 180.0 / UNITY_PI;
      float2 vUv = IN.uv_MainTex;
      float2 coord = vUv;
      float4 FragColor = float4(0.0, 0.0, 0.0, 0.0);
      int samp = _Samples;
      if (samp <= 0) samp = 1;
      for (float i = 0; i < samp; i++) {
          float a = (float)_Angle / (float)samp;
          coord = rotateUV(coord, a);
          float4 texel = tex2D(_MainTex, coord);
          texel *= 1.0 / samp;
          FragColor += texel;
      }
      float4 c = FragColor*_Color;
      o.Albedo = c.rgb;
      o.Alpha = c.a;
  }
  ENDCG
  }
      FallBack "Diffuse"
  }

1 Ответ

0 голосов
/ 02 февраля 2019

Напишите пользовательскую модель освещения

half4 Lighting<Name> (SurfaceOutput s, UnityGI gi)
{
    return half4(s.Albedo, s.Alpha);
}

void Lighting<Name>_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi)
{
}

и измените Lambert на <Name>.

...