Pergunta

Eu tenho um número de RGBA pixels, cada um deles tem um componente alfa.

Então, eu tenho uma lista de pixels:. ( p0 p1 p2 p3 p4 ... pn ), onde p_0_ é o pixel frente e p_n_ é o mais distante (na parte de trás)

A última (ou qualquer) de pixel não é opaco necessário, para o pixel misturado resultante pode ser de alguma forma transparente também. Eu estou misturando a partir do início da lista até o fim, não vice-versa (sim, ele é raytracing). Então, se o resultado a qualquer momento se torna bastante opaca eu posso parar com resultado bastante correta. Vou aplicar o algoritmo de mistura desta maneira: (((( p0 @ p1 ) @ p2 ) @ p3 ) ...)

Alguém pode me sugerir uma fórmula de mistura correta não só para R, G e B, mas para um componente também?

UPD : Eu me pergunto como é possível que, para determinado processo de mistura de cores que pode ter muitas fórmulas? É algum tipo de aproximação? Isso parece loucura, quanto a mim: fórmulas não são tão diferentes que realmente ganhar eficiência ou otimização. Alguém pode esclarecer isso?

Foi útil?

Solução

Alpha-mistura é um daqueles temas que tem mais profundidade do que você imagina. Depende do que os meios de valor alfa em seu sistema, e se você errar, então você vai acabar com resultados que parecem tipo de bem, mas que exibem artefatos estranhos.

Confira papel clássico de Porter e Duff "Imagens composição digital " para um grande, discussão legível e todas as fórmulas. Você provavelmente quer o "over" operador.

Parece que você está fazendo algo mais próximo de renderização de volume. Para uma fórmula e referências, consulte a Gráficos FAQ , pergunta 5.16 "Como fazer I realizar renderização de volume?".

Outras dicas

Existem várias maneiras possíveis de se fazer isso, dependendo de como os valores RGBA realmente representam as propriedades dos materiais.

Aqui está um possível algoritmo. Iniciar com o Final lightr=lightg=lightb=0 cores de pixel, lightleft=1;

Para cada r, g, b, um pixel encontrou avaliar:

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

(Os valores rgba são normalizados entre 0 e 1, e estou assumindo que a = 1, entende-opaco, a = 0 significa totalmente transparente)

Se o primeiro pixel encontrado é azul com opacidade de 50%, então 50% da cor disponível é definida como azul, eo desconhecido descanso. Se um pixel vermelho com opacidade de 50% é a próxima, em seguida, 25% do restante luz é definida como vermelho, para que o pixel tem 50% de azul, 25% vermelho. Se um pixel de verde com opacidade de 60% está próximo, então o pixel é de 50% de azul, 25% vermelho, 15% verde, com 10% da luz remanescente.

Os materiais físicos que correspondem a esta função são os materiais emissores de luz, mas parcialmente opacos: assim, um pixel no meio da pilha nunca pode escurecer a cor final: ela só pode evitar que a luz por trás dele de aumentar a cor final ( por ser negro e totalmente opaco).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top