Вопрос

Есть ли что -то необычное в том, как альфа -компонент обрабатывается в пиксельном шейдере? У меня есть приложение 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, вы получите белый ...

http://www.facewound.com/tutorials/shader1/

Чувак, я работаю над игрой xna, и мне пришлось использовать шейдер из серого пикселя, и у меня возникла та же проблема, с которой вы столкнулись. Я не уверен, что вы знакомы с средой XNA или нет, но я решил проблему, изменив SpriteBatch Рисование SpriteBlendMode из SpriteBlendMode.none к SpriteBlendMode.alphablend, Я надеюсь, что это поможет вам узнать причину.

С уважением,

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top