Pregunta

¿Hay algo inusual acerca de cómo el componente alfa se maneja en un sombreado de píxeles? Tengo una aplicación de WPF para el que mi artista me está dando imágenes en escala de grises para usar como fondos, y la aplicación colorea las imágenes de acuerdo con el estado actual. Así que escribí un sombreado de píxeles (el uso de la infraestructura de la biblioteca WPF Pixel efectos de sombreado) para su uso como un efecto sobre un elemento de imagen. El shader toma un color como un parámetro, que se convierte en HSL por lo que puede manipular el brillo. Luego, para cada pixel de color gris, se calcula un color cuyo brillo se interpola entre el parámetro de color y blanco en función de la luminosidad del píxel de origen.

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

Esto funciona muy bien en los píxeles donde alfa = 1. Pero cuando alfa = 0, los píxeles resultantes salgan blancos, en lugar de tener programa de fondo de la ventana a través. Así que hice un pequeño cambio:

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 src = tex2D(implicitInputSampler, uv);
    if (src.a == 0) 
        return src;
    ...

y ahora las partes transparentes son realmente transparente. ¿Por qué? ¿Por qué no la declaración dst.a = src.a en la primera versión lograr eso? Por desgracia, aunque esto es sólo una solución parcial, ya que se ve a mí como los píxeles con 0

¿Alguien sabe lo que yo no soy la comprensión acerca de la alfa?

¿Fue útil?

Solución

Después de un poco más de búsquedas por Internet, descubrí la pieza que faltaba.

en MSDN : "WPF utiliza alfa pre-multiplicado por todas partes internamente por una serie de razones de rendimiento, por lo que es también la forma en que interpretamos los valores de color en el sombreado de píxeles personalizada".

Así que la solución resulta ser a lanzar en una multiplicación por alfa:

float4 main(float2 uv : TEXCOORD) : COLOR
{
    ...
    dst.rgb *= src.a;
    return dst;
}

Y ahora mi salida se ve como espero que lo haga.

Otros consejos

  

0

Lo que varía son sus expectativas en esta lista?

Todos los valores se van a estar en el rango 0,0 y 1,0 ... sombreadores de píxeles no funcionan en rangos discretos 256 de color, que son de punto flotante donde 1,0 es la intensidad máxima.

Si sus cálculos terminan estableciendo valores de R / G / B a> 1,0 que se van a poner blanco ...

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

Amigo estoy trabajando en un juego XNA, y que tenía que utilizar un sombreado de píxeles en escala de grises y tengo el mismo problema que está enfrentando. Me donno si está familiarizado con el entorno de XNA o no, pero yo resuelto el problema cambiando el SpriteBatch dibujo SpriteBlendMode de SpriteBlendMode.None SpriteBlendMode.AlphaBlend , espero que esto le puede ayudar a saber la razón.

cordiales,

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top