Обработка альфа -канала в эффекте WPF Pixel Shader
-
18-09-2019 - |
Вопрос
Есть ли что -то необычное в том, как альфа -компонент обрабатывается в пиксельном шейдере? У меня есть приложение WPF, для которого мой художник дает мне изображения GreyScale для использования в качестве фона, и приложение окрашивает эти изображения в соответствии с текущим состоянием. Поэтому я написал пиксельный шейдер (используя инфраструктуру библиотеки библиотеки Fixel Shader Effects WPF) для использования в качестве влияния на элемент изображения. Шейдер принимает цвет как параметр, который он преобразует в HSL, чтобы он мог манипулировать яркостью. Затем для каждого серого пикселя он вычисляет цвет, яркость которых интерполируется между параметром цвета и белым пропорционально яркостью исходного пикселя.
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 src = tex2D(implicitInputSampler, uv);
// ...Do messy computation involving src brightness and color parameter...
float4 dst;
dst.r = ...
dst.g = ...
dst.b = ...
dst.a = src.a;
return dst;
}
Это работает просто отлично на пикселях, где альфа = 1. Но где alpha = 0, результирующие пиксели выходят из белых, а не проводятся фона окна. Итак, я сделал крошечное изменение:
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 src = tex2D(implicitInputSampler, uv);
if (src.a == 0)
return src;
...
И теперь прозрачные части действительно прозрачны. Почему? Почему не dst.a = src.a
Заявление в первой версии выполняет это? К сожалению, даже это всего лишь частичное исправление, потому что оно выглядит как пиксели с 0 <alpha <1, выходят из белых.
Кто -нибудь знает, что я не понимаю в Альфе?
Решение
После еще некоторых поисков в Интернете я обнаружил, что мне не хватало.
Согласно с статья о MSDN: «WPF использует предварительную Alpha Ally Fourdhy Interwhe по ряду причин производительности, так что это также способ интерпретировать значения цвета в пользовательском пиксельном шейдере».
Таким образом, исправление оказывается, чтобы добавить умение альфа:
float4 main(float2 uv : TEXCOORD) : COLOR
{
...
dst.rgb *= src.a;
return dst;
}
И теперь мой выход выглядит так, как я ожидаю.
Другие советы
0 <Альфа <1 выходит из белого цвета
Какие диапазоны вы ожидаете здесь?
Все значения будут в диапазоне 0,0 и 1,0 ... пиксельные шейдеры не работают в отдельных 256 цветовых диапазонах, они представляют собой плавающую точку, где 1,0 - максимальная интенсивность.
Если ваши расчеты в конечном итоге устанавливают значения R/G/B на> 1.0, вы получите белый ...
Чувак, я работаю над игрой xna, и мне пришлось использовать шейдер из серого пикселя, и у меня возникла та же проблема, с которой вы столкнулись. Я не уверен, что вы знакомы с средой XNA или нет, но я решил проблему, изменив SpriteBatch Рисование SpriteBlendMode из SpriteBlendMode.none к SpriteBlendMode.alphablend, Я надеюсь, что это поможет вам узнать причину.
С уважением,