2009-05-06 11 views
14

Mi chiedevo se la qualità dei mipmap delle texture sarebbe stata migliore se avessi usato il mio algoritmo per pre-generarli, invece di quello automatico incorporato. Probabilmente userò un algoritmo lento ma carino, come il ricampionamento di Lanczos.Ha senso utilizzare un proprio algoritmo di creazione mipmap per trame OpenGL?

Ha senso? Otterro 'qualsiasi guadagno di qualita' con le moderne schede grafiche?

+0

Unity propone sia 'box' o' filter Kaiser' per generare la catena mipmap. è sicuramente una domanda legittima. –

+0

Penso che stai mescolando due cose insieme. L'interpolazione è, quando hai bisogno di più dati di quelli che hai. I mipmap sono per il caso, quando hai bisogno di meno dati di quelli che hai. Lanczos è l'algoritmo di interpolazione, non ha nulla a che fare con mipmaps. –

risposta

2

Che cosa ti spinge a provare? I mipmap che hai attualmente vengono generati male? (cioè hai guardato?) Tenete a mente che i risultati saranno spesso (tri) linearmente interpolati in ogni caso, quindi tra un movimento e l'altro vi sono spesso rendimenti decrescenti per migliorare il ricampionamento.

+0

Bene, l'algoritmo attuale non può essere molto lento e quindi non può essere così buono. Il costo di pregenerazione e memorizzazione dei mipmap è basso, ma non so se ne valga la pena se i risultati non saranno così evidenti. – GhassanPL

+0

Non sono sicuro di come lo state facendo ora, ma in questi giorni è possibile generare la GPU, che può essere veloce e abbastanza buona. Ancora più importante, però, stai osservando questi alla risoluzione sbagliata, o più probabilmente, interpolando linearmente tra loro. Quindi le tue versioni ricampionate a mano splendidamente realizzate di solito non si vedono ... quindi diminuiscono i rendimenti. Stai effettivamente vedendo artefatti o è puramente accademico? – simon

+0

dipende dal budget della tua azienda. cosa del tempo libero? investitore finanziato? il tuo stipendio ecc ... se ci vuole una settimana per lavorarci, costerà circa 1000 $ o più alla compagnia, ne vale davvero la pena? –

10

Ci sono buoni motivi per generare i propri mipmap. Tuttavia, la qualità del downsampling non è una di queste.

I programmatori di giochi e grafici hanno sperimentato in passato tutti i tipi di algoritmi di downsampling. Alla fine si è scoperto che il semplicissimo "medio quattro pixel" -metodo dà i migliori risultati. Anche i metodi più avanzati sono in teoria matematici più corretti e tendono a togliere molta nitidezza dai mipmap. Questo dà un aspetto piatto (Provalo!).

Per alcuni (a mio avviso non comprensibile) il semplice metodo medio sembra avere il miglior compromesso tra l'antialiasing e mantenere le mipmap nitide.

Tuttavia, è possibile calcolare le mipmap con correzione gamma. OpenGL non lo fa da solo. Questo può fare una vera differenza visiva, specialmente per le trame più scure.

Fare così è semplice. Invece di una media di quattro valori insieme in questo modo:

float average (float a, float b, float c, float d) 
{ 
    return (a+b+c+d)/4 
} 

fare questo:

float GammaCorrectedAverage (float a, float b, float c, float d) 
{ 
    // assume a gamma of 2.0 In this case we can just square 
    // the components. 
    return sqrt ((a*a+b*b+c*c+d*d)/4) 
} 

Questo codice assume i componenti di colore sono normalizzati ad essere nel range da 0 a 1.

+12

In realtà, i "quattro pixel medi" potrebbero non essere il modo migliore per creare mipmap. http://www.number-none.com/product/Mipmapping,%20Part%201/index.html –

2

Dipende sul tipo di risorse che mostri. Il filtro Lanczos si avvicina al filtro passa-basso ideale ei risultati sono notevoli se si confrontano le mappe mip affiancate. La maggior parte delle persone confonderà l'aliasing per la nitidezza - di nuovo dipende se le risorse tendono a contenere le alte frequenze - Ho sicuramente visto casi in cui il filtro box non era una buona opzione. Ma dal momento che la mappa mip viene quindi interpolata linearmente, il guadagno potrebbe non essere così evidente. C'è un'altra cosa da ricordare: la maggior parte delle persone usa il filtro a riquadri e trasmette l'output come input nella fase successiva, in questo modo perdi sia la precisione che l'energia visiva (sebbene la gamma aiuti questo). Se riesci a trovare un codice che usi un filtro arbitrario (tieni presente che la maggior parte di essi è separabile in due passaggi) di solito ridimensionerai il kernel del filtro stesso e producerai livelli di mappa mip dalla trama di base, che è una buona cosa.

+0

buona idea per mantenere l'alta risoluzione texture come la fonte di tutte le mipmap. solo per aggiungere una cosa: i lanczos e i cie aggiungono il suono dei grossi kernel. cura di essere presa qui. –

1

In aggiunta a questa domanda, ho trovato che alcuni mipmapping completamente diversa (piuttosto che quelli semplicemente cercando di ottenere il miglior demoltiplicazione qualità, come il filtraggio Lanczos) algoritmi di avere buoni effetti su alcune texture.

Ad esempio, su alcune trame che dovrebbero rappresentare informazioni ad alta frequenza, ho provato a utilizzare un algoritmo che prende semplicemente un pixel casuale dei quattro che vengono considerati per ogni iterazione. I risultati dipendono molto dalla trama e da ciò che si suppone che trasmetta, ma ho scoperto che ciò dà un grande effetto ad alcuni; non ultimo per trame di terra.

Un altro che ho provato sta prendendo il più deviante dei quattro pixel per preservare i contrasti. Ha ancora meno usi, ma esistono.

Come tale, ho implementato l'opzione per scegliere l'algoritmo di mipmapping per trama.

EDIT: ho pensato di fornire alcuni esempi delle differenze nella pratica. Ecco un pezzo di erba tessitura a terra, l'immagine più a sinistra di essere con mipmapping media di serie, e la destra stare con mipmapping randomizzato:

Average mipmapping, trilinear filtering Random mipmapping, trilinear filtering

Spero che lo spettatore può apprezzare quanto "apparente dettaglio" si perde nella mipmap mediata, e quanto più piatto sembra per questo tipo di texture.

anche per riferimento, qui sono gli stessi campioni con 4 × filtro anisotropico acceso (la sopra essendo tri-lineare):

Average mipmapping, 4× anisotropic filtering Random mipmapping, 4× anisotropic filtering

filtraggio anisotropico fa la differenza meno pronunciato, ma è ancora qui.

+0

belle idee. il 'one random' è come un' più vicino 'ma cerca di rompere aliasing con casualità. "Più vicino" dà sempre risultati più nitidi. –