Domanda

Ho un numero di pixel RGBA, ognuno di essi ha un componente alfa.

Quindi ho un elenco di pixel: ( p0 p1 p2 p3 p4 ... pn ) dove p_0_ è il pixel anteriore e p_n_ è il più lontano (sul retro).

L'ultimo (o qualsiasi) pixel non è necessario opaco, quindi anche il pixel combinato risultante può essere in qualche modo trasparente. Sto mescolando dall'inizio dell'elenco alla fine, non viceversa (sì, è raytracing). Quindi, se il risultato in qualsiasi momento diventa abbastanza opaco, posso fermarmi con un risultato abbastanza corretto. Applicherò l'algoritmo di fusione in questo modo: ((((((( p0 @ p1 ) @ p2 ) @ p3 ) ...)

Qualcuno può suggerirmi una formula di miscelazione corretta non solo per R, G e B, ma anche per il componente A?

UPD : mi chiedo come sia possibile che per un determinato processo di fusione dei colori possiamo avere molte formule? È una specie di approssimazione? Questo mi sembra folle: le formule non sono così diverse da ottenere davvero efficienza o ottimizzazione. Qualcuno può chiarire questo?

È stato utile?

Soluzione

La fusione alfa è uno di quegli argomenti che ha più profondità di quanto si possa pensare. Dipende dal significato del valore alfa nel tuo sistema e, se indovini, finirai con risultati che sembrano un po 'ok, ma che mostrano strani artefatti.

Guarda il classico documento di Porter e Duff " Compositing Digital Image " ; per un'ottima discussione leggibile e tutte le formule. Probabilmente vuoi il "oltre" " operatore.

Sembra che tu stia facendo qualcosa di più vicino al rendering del volume. Per una formula e riferimenti, consultare le FAQ sulla grafica , domanda 5.16 " Come eseguo il rendering del volume? " ;.

Altri suggerimenti

Esistono vari modi possibili per farlo, a seconda di come i valori RGBA rappresentano effettivamente le proprietà dei materiali.

Ecco un possibile algoritmo. Inizia con i colori finali dei pixel lightr = lightg = lightb = 0 , lightleft = 1 ;

Per ogni r, g, b, un pixel rilevato valuta:

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

(I valori RGBA sono normalizzati tra 0 e 1 e presumo che a = 1 significa opaco, a = 0 significa totalmente trasparente)

Se il primo pixel rilevato è blu con opacità del 50%, il 50% del colore disponibile è impostato su blu e il resto sconosciuto. Se è successivo un pixel rosso con opacità del 50%, il 25% della luce rimanente è impostato su rosso, quindi il pixel ha il 50% di blu, il 25% di rosso. Se un pixel verde con opacità del 60% è il prossimo, il pixel è il 50% blu, il 25% rosso, il 15% verde, con il 10% della luce rimanente.

I materiali fisici che corrispondono a questa funzione sono materiali emettitori di luce ma parzialmente opachi: quindi, un pixel al centro della pila non può mai scurire il colore finale: può solo impedire alla luce dietro di esso di aumentare il colore finale ( essendo nero e completamente opaco).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top