Condividi tramite


campionamento Nearest-Point (Direct3D 9)

Le applicazioni non sono necessarie per usare il filtro delle trame. Direct3D può essere impostato in modo da calcolare l'indirizzo del texel, che spesso non restituisce numeri interi e copia il colore del texel con l'indirizzo integer più vicino. Questo processo viene chiamato campionamento dei punti più vicino. Questo può essere un modo rapido ed efficiente per elaborare le trame se le dimensioni della trama sono simili alle dimensioni dell'immagine della primitiva sullo schermo. In caso contrario, la trama deve essere ingrandita o minimizzata. Il risultato può essere un'immagine in blocchi, con alias o sfocata.

L'applicazione C++ può selezionare il campionamento del punto più vicino chiamando il metodo IDirect3DDevice9::SetSamplerState . Impostare il valore del primo parametro sul numero di indice intero (0-7) della trama per cui si sta selezionando un metodo di filtro delle trame. Passare D3DSAMP_MAGFILTER, D3DSAMP_MINFILTER o D3DSAMP_MIPFILTER per il secondo parametro per impostare il filtro di ingrandimento, minificazione o mipmapping. Passare D3DTEXF_POINT nel terzo parametro.

È consigliabile usare con attenzione il campionamento più vicino, perché talvolta può causare artefatti grafici quando la trama viene campionata al limite tra due texel. Questo limite è la posizione lungo la trama (u o v) in cui il texel campionato passa da un texel all'altro. Quando viene usato 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 come elementi grafici indesiderati nella trama visualizzata. Quando si usa il filtro lineare, il texel risultante viene calcolato da texel adiacenti e si fonde uniformemente tra di essi man mano che l'indice della trama si sposta attraverso il limite.

Questo effetto può essere visto quando si esegue il mapping di una trama molto piccola in un poligono molto grande: un'operazione spesso chiamata ingrandimento. Ad esempio, quando si usa una trama simile a una scacchiera, il campionamento dei punti più vicino restituisce una scacchiera più grande che mostra bordi distinti. Al contrario, il filtro lineare delle trame 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, laddove possibile. Attualmente la maggior parte dell'hardware è ottimizzata per il filtro lineare, pertanto l'applicazione non dovrebbe subire prestazioni ridotte. Se l'effetto desiderato richiede assolutamente l'uso del campionamento dei punti più vicino, ad esempio quando si usano trame per visualizzare caratteri di testo leggibili, l'applicazione deve prestare molta attenzione per evitare il campionamento ai limiti del texel, il che potrebbe causare effetti indesiderati. La figura seguente mostra l'aspetto di questi artefatti.

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

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

Per un semplice esempio, si immagini un'applicazione che esegue il rendering dei poligoni con la modalità di indirizzamento delle trame D3DTADDRESS_WRAP. Usando il mapping usato da Direct3D, l'indice di trama u viene mappato come illustrato nel diagramma seguente per una trama con una larghezza di 4 texel.

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

Si noti che le coordinate della trama, 0,0 e 1.0 per questa illustrazione, sono esattamente al limite tra texel. Usando il metodo in base al quale Direct3D esegue il mapping dei valori, le coordinate della trama vanno da [ - 0,5, 4 a 0,5], dove 4 è la larghezza della trama. Per questo caso, il texel campionato è il texel 0 per un indice di trama pari a 1,0. Tuttavia, se la coordinata della trama era solo leggermente inferiore a 1,0, il texel campionato sarebbe il texel n anziché il texel 0.

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

L'esecuzione di questo mapping di coordinate di trama 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 trame in ogni posizione in pixel all'interno di un triangolo. Gli approcci iterativi tendono a nascondere queste inesattezze perché gli errori vengono accumulati uniformemente durante l'iterazione.

L'rasterizzatore di riferimento Direct3D usa un approccio di valutazione diretta per calcolare gli indici delle trame in ogni posizione in pixel. La valutazione diretta è diversa dall'approccio iterativo in quanto qualsiasi inesattezza 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 filtro dei punti più vicino solo quando necessario. Quando è necessario usarlo, è consigliabile sfalsare leggermente le coordinate della trama dalle posizioni limite per evitare artefatti.

Filtro delle trame