Come funziona la mappatura mip con trame non power-of-2?


12

Ho sentito che le GPU recenti supportano tutte le trame non power-of-2 e tutte le funzionalità funzionano. Tuttavia, non capisco come funzionerebbe il mip-mapping in un simile scenario. Qualcuno può spiegare?

Risposte:


13

La regola è che per calcolare la dimensione successiva della mipmap, dividi per due e arrotondhi per difetto all'intero più vicino (a meno che non venga arrotondato per difetto a 0, nel qual caso invece è 1). Ad esempio, un'immagine 57x43 avrebbe mipmap come:

level 0: 57x43
level 1: 28x21
level 2: 14x10
level 3: 7x5
level 4: 3x2
level 5: 1x1

La mappatura UV, la selezione LOD e il filtraggio funzionano allo stesso modo delle dimensioni di trama a potenza di due.

Generare mips di buona qualità per una trama non-power-of-two è un po 'più complicato, poiché non puoi semplicemente fare la media di una scatola di pixel 2x2 per sottocampionare in tutti i casi. Tuttavia, un filtro box 2x2 non era eccezionale all'inizio, quindi è consigliabile utilizzare un filtro di downsampling migliore come Mitchell-Netravali indipendentemente dalle dimensioni della trama.


1
C'è disaccordo tra questa risposta e la risposta di John Calsbeek? L'implementazione corrisponde a entrambe le descrizioni? In caso contrario, sarebbe utile avere un riferimento per l'uno o l'altro (o entrambi se si tratta di due tecniche diverse in uso).
trichoplax,

4

Un modo di pensarci è che le schede grafiche spesso implementano trame non di potenza di 2 semplicemente riempendole fino a quando non hanno una potenza di 2 in ogni direzione. Questo rende la maggior parte delle cose "semplicemente funzionanti": piastrellatura e filtro hardware, per esempio. L'unica cosa che deve cambiare è la conversione da coordinate di trama a coordinate di immagine.

Se implementato in questo modo, è ovvio come fare il mipmapping: nulla cambia. Anche se disponi di una GPU che supporta trame non power-of-2 senza riempimento, i livelli di mipmap finirebbero con "riempimento". ad esempio una trama 3x3 avrebbe una trama 2x2 come lod 1.


C'è disaccordo tra questa risposta e la risposta di Nathan Reed? L'implementazione corrisponde a entrambe le descrizioni? In caso contrario, sarebbe utile avere un riferimento per l'uno o l'altro (o entrambi se si tratta di due tecniche diverse in uso).
trichoplax,

1
@trichoplax Penso che l'affermazione di Nathan secondo cui "generare mips di buona qualità per una trama non potente di due sia un po 'più complicata" rende le nostre risposte in disaccordo almeno leggermente. Questo da solo probabilmente merita più elaborazione.
John Calsbeek,

1
Penso che il problema qui sia che stiamo confondendo la posizione logica dei texel con il loro layout "fisico" in memoria. 1) I pixel sono elementi discreti, ovvero hai sempre bisogno di una dimensione intera, quindi ridimensionare una dimensione dispari significa che dobbiamo arrotondare per eccesso o per difetto. Dato che dobbiamo arrotondare una volta arrivati ​​a una trama Nx1 o 1xN, ha senso arrotondare sempre per eccesso. 2) Se disposto in indirizzi fisici, non è raro imbottire la trama in una dimensione "comoda" "falcata". Questo può essere fatto per 2 motivi: a) Può rendere HW più economico eb) se un ordine di mortale P.of.2 è facile.
Simon F,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.