Come calcolo accuratamente la copertura di curve analitiche sovrapposte?


10

L'antialias delle forme 2D si riduce al calcolo della frazione di pixel coperta dalla forma. Per forme semplici non sovrapposte, ciò non è troppo difficile: ritaglia la forma sul rettangolo di pixel e calcola l'area della forma risultante. Ma diventa più difficile se più forme si sovrappongono allo stesso pixel. La semplice somma delle aree può rendere la copertura calcolata troppo elevata, se trascura la quantità che una forma copre un'altra forma. Ad esempio, vedere la sezione Limitazioni di questo articolo sul rendering dei caratteri . Potresti anche trovarti in una situazione in cui le due curve provengono da oggetti diversi con colori diversi (quindi non si tratta della copertura totale per l'unione delle due forme, ma della copertura di ognuna separatamente).

Come verrebbe calcolato se ci tenessi alla precisione assoluta? Ancora più complicato, come calcolare accuratamente la copertura per sovrapporre forme non poligonali come le curve? C'è qualche punto in cui non hai altra scelta che tornare alle tecniche multisampling o stocastiche?

Risposte:


10

Non c'è davvero un buon modo per farlo in modo efficiente analiticamente per tutti i casi d'angolo. La maggior parte o tutti i renderer 2D commerciali che tentano di eseguire il calcolo della copertura analitica commettono errori prevedibili rispetto ai metodi di multicampionamento.

Un problema tipico sono due forme sovrapposte che condividono lo stesso bordo. La situazione comune è che i canali alfa si sommano a un bordo alfa troppo spesso che alias leggermente. O se le forme hanno colori diversi, il sistema confonde il colore dello sfondo. Questo è estremamente fastidioso.

Immagine

Immagine 1 : il motore di rendering confonde la copertura e crea un sottile contorno bianco dove non dovrebbe esserci alcun contorno.

La seconda copertura perfetta equivale al filtraggio delle scatole. Possiamo sicuramente fare di meglio. Considerando che ci sono così tanti casi angolari speciali che richiederebbero operazioni booleane sulle forme per fare bene, il super campionamento è ancora superiore. In effetti, le stime di copertura possono essere utilizzate per concentrare il campionamento laddove molto probabilmente è necessario.

La situazione potrebbe essere semplificata in poligoni a livelli di sub pixel, quindi la soluzione analitica discreta potrebbe essere risolta. Ma questo a scapito della flessibilità. Ad esempio, non è fuori dubbio che i futuri sistemi vettoriali potrebbero voler consentire linee sfocate a larghezza variabile che rappresentano un problema per le soluzioni analitiche, così come altri oggetti a colori variabili.

Come farlo analiticamente

Scena analitica

Immagine 2 : Supponi di avere questa scena, vista esplosa a destra

Ora non puoi semplicemente farlo analiticamente, ogni pezzo separatamente e quindi unire i dati. Perché risulta in dati errati. Vedere la fusione alfa lascerebbe che il blu brilli attraverso gli spazi vuoti se lo facessi.

Quello che devi fare è dividere la scena in modo che ogni forma elimini ciò che è sotto l'altro:

inserisci qui la descrizione dell'immagine

Immagine 3 : è necessario tagliare le superfici sottostanti.

Ora, se tutto è opaco, allora è tutto semplice. basta calcolare l'area di ogni pezzo e moltiplicarlo per colore e sommarli insieme. Ora è possibile usare qualcosa come questo .

Tutto ciò si interrompe se le singole forme non sono opache fuori rotta ma anche ciò può essere fatto ad un certo livello.

Ricorda:

  • Il calcolo AA deve essere eseguito nello spazio colore lineare e riconvertito per utilizzare lo spazio.

Supponiamo che non ci interessi molto all'efficienza. Come potremmo fare calcoli di copertura per operazioni booleane su forme? È possibile in generale o solo per forme specifiche?
John Calsbeek,

@JohnCalsbeek ok sto iniziando a costruire la risposta analitica, ci vorrà un po '
joojaa
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.