Filtraggio bilineare delle texture

Il filtro bilineare calcola la media ponderata dei 4 texel più vicini al punto di campionamento. Questo approccio al filtro è più accurato e comune rispetto al filtro del punto più vicino. Questo approccio è efficiente perché viene implementato nell'hardware grafico moderno.

Esempio

Le texture vengono sempre indirizzate in modo lineare da (0,0, 0,0) nell'angolo in alto a sinistra a (1,0, 1,0) nell'angolo in basso a destra. L'indirizzamento lineare di una texture è mostrato nella figura seguente.

illustration of 4x4 texture with solid blocks of color

Le texture vengono in genere rappresentate come se fossero composte da blocchi pieni di colore, tuttavia è più corretto pensare alle texture nello stesso modo in cui si dovrebbe pensare alla visualizzazione raster: ogni texel viene definito al centro esatto di una cella della griglia, come mostrato nell'illustrazione seguente.

illustration of 4x4 texture with texels defined at the center of the grid cells

Se si chiede al campionatore di texture il colore di questa texture alle coordinate UV (0,375, 0,375), si otterrà un rosso pieno (255, 0, 0). Ha senso perché il centro della cella del texel rosso si trova in corrispondenza di UV (0,375, 0,375). Cosa accadrebbe se si chiedesse al campionatore il colore della texture in corrispondenza di UV (0,25, 0,25)? Non è così facile, perché il punto in corrispondenza di UV (0,25, 0,25) si trova all'angolo esatto di 4 texel.

Secondo lo schema più semplice, definito filtraggio punti, il campionatore dovrebbe restituire il colore del texel più vicino, (vedere Campionamento del punto più vicino) ed è in genere indesiderato a causa di risultati granulosi e bloccati. Il campionamento del punto della texture in corrispondenza di UV (0,25, 0,25) fa emergere un altro problema con il filtro del punto più vicino: dal punto di campionamento sono presenti quattro texel equidistanti, quindi non esiste un singolo texel più vicino. Uno di questi quattro texel verrà scelto come colore restituito, ma la selezione dipende dalla modalità di arrotondamento della coordinata, che può introdurre artefatti (vedere l'articolo Campionamento del punto più vicino 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 metodo è denominato filtro bilineare. Il costo di calcolo aggiuntivo per il filtro bilineare è in genere trascurabile perché questa routine viene implementata nell'hardware grafico moderno. Ecco i colori che si ottengono in alcuni punti di campionamento diversi usando il filtro bilineare:

UV: (0.5, 0.5)

Questo punto si trova al bordo esatto tra texel rossi, verdi, blu e bianchi. Il colore restituito dal campionatore è 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 rossi e verdi. Il colore restituito dal campionatore è 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, ovvero il colore restituito (tutti gli altri texel nel calcolo del filtro sono ponderati a 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 all'illustrazione seguente, che mostra cosa accade se il calcolo del filtro bilineare viene eseguito a ogni indirizzo della texture 4x4.

illustration of 4x4 texture with bilinear filtering performed at every texture address

Filtro della texture