Сделайте белый спрайт в XNA 4.0 с простым шейдером - PullRequest
1 голос
/ 07 марта 2012

Используя простой шейдер в Tint Sprite White и образец кода в Образец эффектов Sprite , я загрузил файл .fx для шейдера в пример проекта и заменил одинпримеров эффектов в одном из вызовов Draw () для использования отбеливающего эффекта.

Я получаю большой белый квадрат с такими же размерами, что и сама текстура.Я, очевидно, хочу, чтобы только области текстуры, где альфа не равна 0, делались белыми.Кажется, шейдер работает, так как я изменил белый цвет по умолчанию на другие тестовые случаи, а квадрат действительно меняет цвет.

Я попробовал это в простом проекте и получил тот же результат.Как я могу убедиться, что только видимая часть текстуры закрашена?

Модифицированный вызов выглядит так:

        spriteBatch.Begin(0, null, null, null, null, whiteEffect);

        spriteBatch.Draw(myTexture, CenterOnScreen(myTexture), Color.White);

        spriteBatch.End();

1 Ответ

5 голосов
/ 07 марта 2012

Во-первых, проверьте еще раз, чтобы убедиться, что у вас есть альфа на вашем изображении.

Этот шейдер предполагает, что вы используете без предварительного умножения альфа:

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);
   }
}
...