У шейдера Unity есть все каналы текстуры 0 - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь написать обрезанный шейдер, который использует _MainTex в проходе ShadowCaster, где у меня есть проход:

Pass {
  Name "ShadowCaster"
  Tags {
    "LightMode"="ShadowCaster"
  }
  Offset 1, 1
  Cull Off

  CGPROGRAM
  #pragma vertex vert
  #pragma fragment frag
  // ...
  #pragma multi_compile_shadowcaster
  // ...

  // structs and variables
  // ...
}

Фрагмент шейдера выглядит так:

float4 frag(VertexOutput i, float facing : VFACE) : COLOR {

  // no shadow on the pixel if alpha less than a cutoff
  float4 texcol = tex2D( _MainTex, i.uv1.xy );
  // but it's always = 0, so everything is cutoff
  clip(texcol.a * _Color.a - _Cutoff);
  // it returns 0, which doesn't matter
  SHADOW_CASTER_FRAGMENT(i)
}

У texcol всегда есть 0 для альфа-канала, так как я могу проверить с помощью clip(texcol.a - 0.0) и изменить число. И значение, которое я использовал в tex2D, является прямой копией из предыдущего прохода:

VertexOutput vert (VertexInput v) {
  VertexOutput o = (VertexOutput)0;
  o.uv1 = v.texcoord1;
  // ...
  TRANSFER_SHADOW_CASTER(o)
  return o;
}

И структуры:

struct VertexInput {
  float4 vertex : POSITION;
  float2 texcoord1 : TEXCOORD1;
  float2 texcoord2 : TEXCOORD2;
}

struct VertexOutput {
  V2F_SHADOW_CASTER;
  float2 uv1 : TEXCOORD1;
  float2 uv2 : TEXCOORD2;
  float4 posWorld : TEXCOORD3;
}

Что не так с преобразованием текстуры, которое я использовал в tex2D? Или что-то еще? Я уверен, что сама текстура обеспечивает правильное значение альфа.


Обновление . Полный проход шейдера на гист, есть соответствующая часть: https://gist.github.com/KHN190/0fd1d2bab899fbe2fcc809c6755b3d74

...