Во-первых, проверьте еще раз, чтобы убедиться, что у вас есть альфа на вашем изображении.
Этот шейдер предполагает, что вы используете без предварительного умножения альфа:
batch.Begin(0, BlendState.NonPremultiplied, null, null, null, whiteEffect);
Шейдер использует текстуруальфа-значение как основа для отбеливания;Другими словами, чем более прочный альфа, тем сильнее отбеливающий эффект.Если вам не нужны какие-либо "промежуточные" (например, частично белые), это сработает, если в вашей текстуре нет альфа-интермедиата.
Без предварительного умножения альфа-частичного белого (оригинал)) Версия
float4 ps_main( PS_INPUT Input ) : COLOR0
{
float4 color = tex2D( baseMap, Input.Texcoord );
return float4(1.0f, 1.0f, 1.0f, color.a);
}
РЕДАКТИРОВАТЬ: Поскольку предварительно умноженная версия была запрошена, я добавлю эту версию с объяснением.
С эта полезная статья :
Чтобы преобразовать неумноженный цвет в предварительно умноженный формат:
color.rgb * = color.a
Так что давайте сделаем то же самое здесь, в нашем шейдере:
Предварительно умноженная альфа-версия с частичным белым разрешением
float4 ps_main( PS_INPUT Input ) : COLOR0
{
float4 color = tex2D( baseMap, Input.Texcoord );
return float4(color.a, color.a, color.a, color.a);
}
Теперь вы можете использовать стандартное состояние альфа-смешивания по умолчанию:
batch.Begin(0, BlendState.AlphaBlend, null, null, null, whiteEffect);
Я все еще не оченьконечно, если вам нужен жесткий "белый или прозрачный" ... в этом случае не имеет значения, делаете ли вы предварительное умножение или нет, потому что вы можете просто сделать возвращение чистого белого в "логическом" стиле (1.0f, 1.0f, 1,0f, 1,0f) или чисто прозрачный (0,0f, 0,0f, 0,0f, 0,0f);оба эти конкретных цвета будут отображаться одинаково независимо от состояния наложения:
Жесткий белый или прозрачный (игнорирует частичные белые), Предварительно умноженный-агностический
float4 ps_main( PS_INPUT Input ) : COLOR0
{
float4 color = tex2D( baseMap, Input.Texcoord );
if (color.a > 0.0f)
{
return float4(1.0f, 1.0f, 1.0f, 1.0f);
}
else
{
return float4(0.0f, 0.0f, 0.0f, 0.0f);
}
}