Pregunta

Tengo varios píxeles RGBA, cada uno de ellos tiene un componente alfa.

Tengo una lista de píxeles: ( p0 p1 p2 p3 p4 ... pn ) donde p_0_ es el píxel frontal y p_n_ es el más lejano (en la parte posterior).

El último (o cualquier) píxel no es necesario opaco, por lo que el píxel combinado resultante también puede ser de alguna manera transparente. Estoy mezclando desde el principio de la lista hasta el final, no viceversa (sí, es raytracing). Entonces, si el resultado en cualquier momento se vuelve lo suficientemente opaco, puedo detenerme con el resultado correcto. Aplicaré el algoritmo de fusión de esta manera: ((((( p0 @ p1 ) @ p2 ) @ p3 ) ...)

¿Puede alguien sugerirme una fórmula de mezcla correcta no solo para R, G y B, sino también para el componente A?

UPD : Me pregunto cómo es posible que para un proceso determinado de combinación de colores podamos tener muchas fórmulas. ¿Es algún tipo de aproximación? Esto parece una locura, como para mí: las fórmulas no son tan diferentes que realmente obtenemos eficiencia u optimización. ¿Alguien puede aclarar esto?

¿Fue útil?

Solución

La mezcla alfa es uno de esos temas que tiene más profundidad de lo que piensas. Depende de lo que signifique el valor alfa en tu sistema, y ??si adivinas mal, terminarás con resultados que se ven bastante bien, pero que muestran artefactos extraños.

Echa un vistazo al documento clásico de Porter y Duff " Composición de imágenes digitales y quot ; Para una gran discusión, legible y todas las fórmulas. Probablemente quieras que " sobre " operador.

Parece que estás haciendo algo más parecido a la representación de volumen. Para obtener una fórmula y referencias, consulte las Preguntas frecuentes sobre gráficos , pregunta 5.16 " cómo ¿Realizo la representación de volumen? " ;.

Otros consejos

Hay varias formas posibles de hacer esto, dependiendo de cómo los valores RGBA representan realmente las propiedades de los materiales.

Aquí hay un posible algoritmo. Comience con los colores de píxeles finales lightr = lightg = lightb = 0 , lightleft = 1 ;

Para cada r, g, b, evaluar un píxel encontrado:

lightr += lightleft*r*(1-a)
lightg += lightleft*g*(1-a)
lightb += lightleft*b*(1-a)
lightleft *= 1-a;

(Los valores RGBA están normalizados entre 0 y 1, y supongo que a = 1 significa opaco, a = 0 significa completamente transparente)

Si el primer píxel encontrado es azul con una opacidad del 50%, entonces el 50% del color disponible se establece en azul, y el resto se desconoce. Si un píxel rojo con una opacidad del 50% es el siguiente, entonces el 25% de la luz restante se establece en rojo, por lo que el píxel tiene un 50% de azul, un 25% de rojo. Si un píxel verde con opacidad es del 60%, el píxel es 50% azul, 25% rojo, 15% verde y queda un 10% de la luz.

Los materiales físicos que corresponden a esta función son materiales emisores de luz pero parcialmente opacos: por lo tanto, un píxel en el centro de la pila nunca puede oscurecer el color final: solo puede evitar que la luz detrás de él aumente el color final ( siendo negro y totalmente opaco).

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