Я пытаюсь написать обрезанный шейдер, который использует _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