2009-05-06 10 views
14

Ich frage mich, ob die Qualität der Textur Mipmaps besser wäre, wenn ich meinen eigenen Algorithmus für die Vorgenerierung sie verwenden würde, anstelle der eingebauten automatischen. Ich würde wahrscheinlich einen langsamen aber schönen Algorithmus verwenden, wie Lanczos Resampling.Macht es Sinn, einen eigenen Mipmap-Erstellungsalgorithmus für OpenGL-Texturen zu verwenden?

Macht es Sinn? Bekomme ich irgendwelche Qualitätsgewinn auf modernen Grafikkarten?

+0

Unity schlägt entweder '' box' oder Kaiser' Filter die Mipmap-Kette zu erzeugen. es ist definitiv eine legitime Frage. –

+0

Ich denke du mischst zwei Dinge zusammen. Interpolation ist, wenn Sie mehr Daten benötigen als Sie haben. Mipmaps sind für den Fall, wenn Sie weniger Daten benötigen als Sie haben. Lanczos ist der Interpolationsalgorithmus, er hat nichts mit Mipmaps zu tun. –

Antwort

2

Was motiviert Sie zum Probieren? Sind die Mipmaps, die du gerade hast, schlecht generiert? (d. h. hast du geschaut?) Bedenke, dass deine Ergebnisse oft immer noch (dreifach) linear interpoliert werden, so dass zwischen diesen Bewegungen oft eine stark abnehmende Rückkehr zu einem verbesserten Resampling stattfindet.

+0

Nun, der aktuelle Algorithmus kann nicht sehr langsam sein und kann daher nicht so gut sein. Die Kosten für das Vorgenerieren und Speichern der Mipmaps sind gering, aber ich weiß nicht, ob es sich lohnt, wenn die Ergebnisse nicht so auffällig sind. – GhassanPL

+0

Ich bin mir nicht sicher, wie du es jetzt machst, aber heutzutage kannst du die GPU generieren lassen, was schnell und ziemlich gut sein kann. Noch wichtiger ist jedoch, dass Sie diese entweder mit der falschen Auflösung betrachten oder eher linear zwischen ihnen interpolieren. So werden Ihre wunderschön gearbeiteten Hand-resampled Versionen normalerweise nicht gesehen ... folglich abnehmende Erträge. Siehst du tatsächlich Artefakte oder ist das rein akademisch? – simon

+0

hängt von Ihrem Geschäftsbudget ab. Freizeit-Ding? Anleger finanziert? Ihr Gehalt etc ... Wenn es eine Woche dauert, um daran zu arbeiten, wird es etwa 1000 $ oder mehr für das Unternehmen kosten, ist es das wirklich wert? –

10

Es gibt gute Gründe, eigene Mipmaps zu generieren. Die Qualität des Downsampling gehört jedoch nicht dazu.

Spiel- und Grafikprogrammierer haben in der Vergangenheit mit allen Arten von Downsampling-Algorithmen experimentiert. Am Ende stellte sich heraus, dass die sehr einfache "Durchschnitt Vier Pixel" -Methode die besten Ergebnisse liefert. Auch fortgeschrittenere Methoden sind mathematisch korrekter, sie neigen dazu, eine Menge Schärfe aus den Mipmaps zu nehmen. Dies gibt ein flaches Aussehen (Probieren Sie es!).

Für einige (für mich nicht verständlich) Grund scheint die einfache durchschnittliche Methode den besten Kompromiss zwischen Antialiasing und halten die Mipmaps scharf.

Sie können jedoch Ihre Mipmaps mit Gamma-Korrektur berechnen. OpenGL macht das nicht alleine. Dies kann einen echten optischen Unterschied machen, besonders bei dunkleren Texturen.

Dies ist einfach. Statt vier Werte zusammen, wie dies im Durchschnitt:

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

tun:

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) 
} 

Dieser Code setzt voraus, Ihre Farbkomponenten normiert sind im Bereich zu sein von 0 bis 1

+12

Eigentlich sind die "durchschnittlichen vier Pixel" möglicherweise nicht die beste Methode zum Erstellen von Mipmaps. http://www.number-none.com/product/Mipmapping,%20Part%201/index.html –

2

Es hängt auf die Art von Vermögenswerten, die Sie anzeigen. Der Lanczos-Filter kommt dem idealen Tiefpassfilter näher und die Ergebnisse fallen auf, wenn Sie die Mip-Karten nebeneinander vergleichen. Die meisten Leute werden das Aliasing für Schärfe halten - wieder hängt es davon ab, ob Ihre Assets dazu neigen, hohe Frequenzen zu enthalten - ich habe definitiv Fälle gesehen, in denen Boxfilter keine gute Option waren. Aber da die Mip-Map dann linear interpoliert wird, ist die Verstärkung möglicherweise nicht so auffällig. Es gibt eine andere Sache zu erwähnen - die meisten Leute verwenden Box-Filter und übergeben Sie die Ausgabe als Eingabe in die nächste Stufe - auf diese Weise verlieren Sie sowohl Präzision und visuelle Energie (obwohl Gamma wird dies helfen). Wenn Sie mit Code kommen, der einen beliebigen Filter verwendet (bedenken Sie, dass die meisten davon in zwei Durchgänge zerlegbar sind), würden Sie normalerweise den Filterkernel selbst skalieren und Mip-Map-Level aus der Basistextur erzeugen, was eine gute Sache ist.

+0

gute Idee, die hohe Auflösung Textur als Quelle für alle Mipmaps zu halten. nur um eins hinzuzufügen: lanczos und cie fügen mit größeren kerneln hinzu. Vorsicht ist hier geboten. –

1

Als Ergänzung zu dieser Frage habe ich festgestellt, dass einige völlig andere Mipmapping-Algorithmen (anstatt diejenigen, die einfach versuchen, die beste Qualität wie Lanczos Filterung zu erreichen) gute Effekte auf bestimmte Texturen haben.

Zum Beispiel habe ich bei einigen Texturen, die hochfrequente Informationen darstellen sollen, versucht, einen Algorithmus zu verwenden, der einfach ein zufälliges Pixel der vier verwendet, die für jede Iteration berücksichtigt werden. Die Ergebnisse hängen stark von der Textur und von dem ab, was sie vermitteln soll, aber ich habe festgestellt, dass es bei einigen eine große Wirkung hat; nicht zuletzt für Bodentexturen.

Eine andere, die ich ausprobiert habe, ist die Abweichung der vier Pixel, um die Kontraste zu erhalten. Es hat noch weniger Anwendungen, aber sie existieren.

Als solche habe ich die Option zur Auswahl Mipmapping-Algorithmus pro Textur implementiert.

EDIT: Ich dachte, ich könnte einige Beispiele für die Unterschiede in der Praxis bieten. Hier ist ein Stück Gras Textur auf dem Boden, die ganz linke Bild mit Standard-Durchschnitt Mipmapping zu sein, und die rechte mit randomisierten Mipmapping sein:

Average mipmapping, trilinear filtering Random mipmapping, trilinear filtering

ich der Zuschauer hoffen kann, schätzen, wie viel „scheinbare Detail“ ist in der gemittelten Mipmap verloren und wie viel flacher es für diese Art von Textur aussieht.

auch als Referenz, sind hier die gleichen Proben mit 4 × anisotrope Filterung eingeschaltet (die oben sein Tri-linear):

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

anisotrope Filterung der Unterschied weniger ausgeprägt macht, aber es ist noch da.

+0

nette Ideen. Der 'one random' ist wie ein' nearest', versucht aber Aliasing mit Zufälligkeit zu brechen. "Nearest" liefert in der Tat immer schärfere Ergebnisse. –