Condividi tramite


Campionamento al punto più vicino

Le applicazioni non sono necessarie per usare il filtraggio delle texture. Direct3D può essere impostato in modo che calcoli l'indirizzo del texel, che spesso non restituisce numeri interi e copia il colore del texel con l'indirizzo del numero intero più vicino. Questo processo viene denominato campionamento del punto più vicino. Il campionamento a punti vicini può essere effettuato se le dimensioni della texture sono simili a quelle dell'immagine della primitiva sullo schermo. In caso contrario, la texture deve essere ingrandita o minimizzata. Il risultato della mancata corrispondenza delle dimensioni delle texture alle dimensioni primitive dell'immagine può essere un'immagine in blocchi, con alias o sfocata.

Usare attentamente il campionamento del punto più vicino, perché a volte può causare artefatti grafici quando la texture viene campionata al limite tra due texel. Questo limite è la posizione lungo la texture (u o v) in corrispondenza della quale il texel campionato passa da un texel al successivo. Quando si usa il campionamento dei punti, il sistema sceglie un texel di esempio o l'altro e il risultato può cambiare bruscamente da un texel al texel successivo man mano che viene superato il limite. Questo effetto può apparire sotto forma di elementi grafici indesiderati nella texture visualizzata. Quando si usa il filtro lineare, il texel risultante viene calcolato da texel adiacenti e si fonde uniformemente tra di essi mentre l'indice della texture si sposta attraverso il limite.

Questo effetto può essere visto quando si esegue il mapping di una texture molto piccola in un poligono molto grande: un'operazione spesso detta ingrandimento. Ad esempio, quando si usa una texture simile a una scacchiera, il campionamento dei punti più vicino genera una scacchiera più grande che mostra bordi distinti. Al contrario, il filtro lineare delle texture genera un'immagine in cui i colori della scacchiera variano uniformemente tra i poligoni.

Nella maggior parte dei casi, le applicazioni ricevono i risultati migliori evitando il campione più vicino possibile. La maggior parte dell'hardware è attualmente ottimizzata per il filtro lineare, quindi l'applicazione non dovrebbe subire prestazioni ridotte. Se l'effetto desiderato richiede assolutamente l'uso del campionamento del punto più vicino, ad esempio quando si usano texture per visualizzare caratteri di testo leggibili, l'applicazione deve prestare molta attenzione per evitare il campionamento ai limiti del texel, che potrebbe causare effetti indesiderati. La figura seguente illustra l'aspetto di questi artefatti.

illustrazione di una scatola a sei sezioni con linee orizzontali non contigue nei due quadrati in alto a destra

I due quadrati in alto a destra del gruppo appaiono diversi rispetto ai vicini, con offset diagonali che li attraversano. Per evitare elementi grafici come questi, è necessario avere familiarità con le regole di campionamento delle texture Direct3D per il filtro dei punti più vicino. Direct3D esegue il mapping di una coordinata di texture a virgola mobile compresa tra [0,0, 1,0] (0,0 e 1,0 inclusi) su un valore di spazio texel intero compreso tra [ - 0,5, n - 0,5], dove n è il numero di texel in una determinata dimensione sulla texture. L'indice della texture risultante viene arrotondato al numero intero più vicino. Questo mapping può introdurre imprecisioni di campionamento a limiti di texel.

Per un esempio semplice, si immagini un'applicazione che esegue il rendering dei poligoni con la funzionalità Esegui il wrapping della modalità indirizzo texture Usando il mapping usato da Direct3D, l'indice di texture u viene mappato come illustrato nel diagramma seguente per una texture con una larghezza di 4 texel.

diagramma delle coordinate di trama 0.0 e 1.0 al limite tra texel

Le coordinate della texture, 0,0 e 1,0 per questa illustrazione, sono esattamente al limite tra i texel. Usando il metodo con cui Direct3D esegue il mapping dei valori, le coordinate della texture vanno da [ - 0,5, 4 - 0,5], dove 4 è la larghezza della texture. Per questo caso, il texel campionato è il texel 0 per un indice di texture pari a 1,0. Tuttavia, se la coordinata della texture era solo leggermente inferiore a 1,0, il texel campionato sarà il texel n anziché il texel 0.

L'implicazione di questo è che l'ingrandimento di una texture piccola usando le coordinate di trama esattamente 0,0 e 1,0 con il filtro più vicino a un triangolo allineato allo spazio dello schermo produce pixel per cui la mappa della texture viene campionata al limite tra texel. Eventuali imprecisioni nel calcolo delle coordinate della texture, tuttavia piccole, comportano artefatti lungo le aree dell'immagine sottoposta a rendering che corrispondono ai bordi del texel della mappa delle texture.

L'esecuzione di questo mapping di coordinate di texture a virgola mobile a texel interi con precisione perfetta è difficile, dispendiosa dal punto di vista computazionale e in genere non necessaria. La maggior parte delle implementazioni hardware usa un approccio iterativo per calcolare le coordinate delle texture in ogni posizione in pixel all'interno di un triangolo. Gli approcci iterativi tendono a nascondere queste imprecisioni perché gli errori vengono accumulati uniformemente durante l'iterazione.

Il rasterizzatore di riferimento Direct3D usa un approccio di valutazione diretta per calcolare gli indici delle texture in ogni posizione pixel. La valutazione diretta differisce dall'approccio iterativo in quanto qualsiasi imprecisione nell'operazione presenta una distribuzione di errori più casuale. Il risultato è che gli errori di campionamento che si verificano ai limiti possono essere più evidenti perché il rasterizzatore di riferimento non esegue questa operazione con precisione perfetta.

L'approccio migliore consiste nell'usare il filtraggio dei punti più vicino solo quando necessario. Quando è necessario usarlo, è consigliabile sfalsare leggermente le coordinate della texture dalle posizioni limite per evitare artefatti.

Filtro della texture