La mia domanda riguarda in particolare Metal, poiché non so se la risposta cambierebbe per un'altra API.
Ciò che credo di aver capito finora è questo:
Una trama mipmapped ha pre-calcolato i "livelli di dettaglio", in cui i livelli più bassi di dettaglio vengono creati effettuando il downsampling della trama originale in modo significativo.
I livelli di mipmap sono indicati in ordine decrescente di dettaglio, dove livello
0
è la trama originale e livelli più alti ne riducono la potenza di due.La maggior parte delle GPU implementano il filtro trilineare, che seleziona due livelli mipmap adiacenti per ciascun campione, campioni da ciascun livello utilizzando il filtro bilineare e quindi fonde linearmente quei campioni.
Quello che non capisco bene è come vengono selezionati questi livelli mipmap. Nella documentazione per la libreria standard di Metal, vedo che è possibile prelevare campioni, con o senza specificare un'istanza di un lod_options
tipo. Suppongo che questo argomento cambierà la modalità di selezione dei livelli di mipmap e che apparentemente ci sono tre tipi di lod_options
trame 2D:
bias(float value)
level(float lod)
gradient2d(float2 dPdx, float2 dPdy)
Sfortunatamente, la documentazione non si preoccupa di spiegare cosa fanno queste opzioni. Posso indovinare che bias()
distorce alcuni livelli di dettaglio scelti automaticamente, ma allora cosa significa pregiudizio value
? Su quale scala opera? Analogamente, come è il lod
di level()
traduce in livelli discreti mipmap? E, operando nel presupposto che gradient2d()
utilizza il gradiente della coordinata della trama, come usa quel gradiente per selezionare il livello di mipmap?
Ancora più importante, se lod_options
ometto, come vengono selezionati i livelli di mipmap? Ciò differisce in base al tipo di funzione eseguita?
E, se l'operazione predefinita specificata no-lod-options della sample()
funzione è fare qualcosa di simile gradient2D()
(almeno in uno shader di frammenti), utilizza derivati dello spazio dello schermo semplici o funziona direttamente con rasterizzatore e coordinate di trama interpolate calcolare un gradiente preciso?
E infine, quanto è coerente questo comportamento da dispositivo a dispositivo? Un vecchio articolo (vecchio come in DirectX 9) che ho letto si riferiva a una selezione mipmap complessa specifica del dispositivo, ma non so se la selezione mipmap sia meglio definita su architetture più recenti.