Condividi tramite


Filtro trama bilineare (Direct3D 9)

Le trame vengono sempre indirizzate in modo lineare da (0,0, 0,0) nell'angolo superiore sinistro a (1.0, 1.0) nell'angolo inferiore destro, come illustrato nella figura seguente.

illustrazione della trama 4x4 con blocchi a tinta unita di colore

Le trame sono in genere rappresentate come se fossero costituite da blocchi a tinta unita di colore, ma è in realtà più corretto pensare alle trame allo stesso modo in cui si dovrebbe pensare alla visualizzazione raster: ogni texel è definito al centro esatto di una cella della griglia, come illustrato nella figura seguente.

illustrazione della trama 4x4 con texel definiti al centro delle celle della griglia

Se si chiede al campione di trama il colore di questa trama in coordinate UV (0,375, 0,375) si otterrà rosso solido (255, 0, 0). Questo ha senso perfetto perché il centro esatto della cella texel rosso è a UV (0,375, 0,375). Cosa succede se si chiede al campione il colore della trama in UV (0,25, 0,25)? Non è abbastanza facile, perché il punto in UV (0,25, 0,25) si trova all'angolo esatto di 4 texel.

La combinazione più semplice consiste semplicemente nel restituire il colore del texel più vicino; questo viene chiamato Filtro punti (vedere Campionamento più vicino del punto (Direct3D 9) e in genere è indesiderato a causa di risultati granulari o bloccati. Il campionamento del punto della trama all'UV (0,25, 0,25) mostra un altro problema sottile con il filtro a punto più vicino: ci sono quattro texel equidistant dal punto di campionamento, quindi non esiste un singolo texel più vicino. Uno di questi quattro texel verrà scelto come colore restituito, ma la selezione dipende dal modo in cui la coordinata viene arrotondata, che può introdurre artefatti di strappo (vedere l'articolo campionamento Nearest-Point nell'SDK).

Uno schema di filtro leggermente più accurato e più comune consiste nel calcolare la media ponderata dei 4 texel più vicini al punto di campionamento; questo è chiamato filtro Bilinear e il costo di calcolo aggiuntivo è in genere trascurabile perché questa routine viene implementata nell'hardware grafico moderno. Ecco i colori che si ottengono in alcuni punti di esempio diversi usando il filtro bilineare:

UV: (0.5, 0.5)

Questo punto si trova al bordo esatto tra rosso, verde, blu e texel bianco. Il colore restituito dall'sampler è grigio:

  0.25 * (255, 0, 0)
  0.25 * (0, 255, 0) 
  0.25 * (0, 0, 255) 
## + 0.25 * (255, 255, 255) 
------------------------
= (128, 128, 128)
UV: (0.5, 0.375)

Questo punto si trova al punto intermedio del bordo tra texel rosso e verde. Il colore restituito dal sampler è giallo-grigio (si noti che i contributi dei texel blu e bianchi vengono ridimensionati a 0):

  0.5 * (255, 0, 0)
  0.5 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (128, 128, 0)
UV: (0.375, 0.375)

Questo è l'indirizzo del texel rosso, che è il colore restituito (tutti gli altri texel nel calcolo del filtro sono ponderati su 0):

  1.0 * (255, 0, 0)
  0.0 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (255, 0, 0)

Confrontare questi calcoli con la figura seguente, che mostra cosa accade se il calcolo del filtro bilineare viene eseguito in ogni indirizzo di trama nella trama 4x4.

illustrazione della trama 4x4 con filtro bilineare eseguito in ogni indirizzo della trama

Filtro trama