MipMaps: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Beispiel: Vergleich der 64er Versionen verbessert.)
K (Orginal -> Original)
Zeile 1: Zeile 1:
 
Mip Mapping (MIP = ''multum in parvo'' = vieles im Kleinen), ist eine Technik welche die Darstellungsqualität von Bildern ([[Texturen]]) verbessert, wenn diese kleiner als in der ursprünglichen Größe dargestellt werden (bezogen auf die Auflösung des Bildes in Pixeln). Als angenehmer Nebeneffekt wird normalerweise auch weniger Rechenzeit benötigt, wenn ein Bild mit Hilfe von MipMaps verkleinert dargestellt wird. Dies wird jedoch durch einen vergrößerten Speicherplatzverbrauch zum Ablegen der MipMaps im Speicher (entweder Hauptspeicher oder Grafikkartenspeicher) ''erkauft''.
 
Mip Mapping (MIP = ''multum in parvo'' = vieles im Kleinen), ist eine Technik welche die Darstellungsqualität von Bildern ([[Texturen]]) verbessert, wenn diese kleiner als in der ursprünglichen Größe dargestellt werden (bezogen auf die Auflösung des Bildes in Pixeln). Als angenehmer Nebeneffekt wird normalerweise auch weniger Rechenzeit benötigt, wenn ein Bild mit Hilfe von MipMaps verkleinert dargestellt wird. Dies wird jedoch durch einen vergrößerten Speicherplatzverbrauch zum Ablegen der MipMaps im Speicher (entweder Hauptspeicher oder Grafikkartenspeicher) ''erkauft''.
  
Wird ein Bild ohne MipMaps verkleinert dargestellt, dann erscheint dieses Bild (besonders bei einer [[Animation]]) oft unruhig, da sich die einzelnen Pixel oft verändern. Den Effekt kann man mit Rauschen oder Krisseln beschreiben und ist in der Regel unerwünscht. Es rührt daher, dass durch die Verkleinerung ausgehend vom Orginalbild die Frequenzen  der Zeilen und Spalten nicht korrekt behandelt werden.
+
Wird ein Bild ohne MipMaps verkleinert dargestellt, dann erscheint dieses Bild (besonders bei einer [[Animation]]) oft unruhig, da sich die einzelnen Pixel oft verändern. Den Effekt kann man mit Rauschen oder Krisseln beschreiben und ist in der Regel unerwünscht. Es rührt daher, dass durch die Verkleinerung ausgehend vom Originalbild die Frequenzen  der Zeilen und Spalten nicht korrekt behandelt werden.
  
Soll aus den [[Texel|Texeln]] der Textur das Zielpixel berechnet werden, so wird man in der Regel mehrere Texel zur Berechnung verwenden (siehe [[bilinear|bilineares Filtern]]). Benutzt man dabei statt der orginal Textur eine Mipmap so spricht man auch von [[trilinear|trilinearer Filterung]]. Man kann die Ergebnisse des trinilearen Filterns sogar noch verbessern, indem man den [[Anisotropes Filtern|anisotrophischen Filteralgorithmus]] verwendet.
+
Soll aus den [[Texel|Texeln]] der Textur das Zielpixel berechnet werden, so wird man in der Regel mehrere Texel zur Berechnung verwenden (siehe [[bilinear|bilineares Filtern]]). Benutzt man dabei statt der original Textur eine Mipmap so spricht man auch von [[trilinear|trilinearer Filterung]]. Man kann die Ergebnisse des trinilearen Filterns sogar noch verbessern, indem man den [[Anisotropes Filtern|anisotrophischen Filteralgorithmus]] verwendet.
 
Das Gegenteil zum Mipmapping ist die [[Interpolation]] bei der Vergößerung von Bildern.
 
Das Gegenteil zum Mipmapping ist die [[Interpolation]] bei der Vergößerung von Bildern.
  
 
==Beispiel==
 
==Beispiel==
  
Dies ist das Bild in der orginalen Größe von 256x256 Pixeln: [[Bild:Sf256.jpg|San Francisco Skyline]]
+
Dies ist das Bild in der originalen Größe von 256x256 Pixeln: [[Bild:Sf256.jpg|San Francisco Skyline]]
  
Soll nun dieses Bild in 64x64 Pixeln dargestellt werden, so wird normalerweise einfach nur jede vierte horizontale Zeile und jede vierte vertikale Spalte angezeigt: [[Bild:Sf64u.jpg]] Man kann erkennen, dass das Resultat sehr ''pixelig'' aussieht (Für Menschen ohne 200% Sehschärfe vielleicht mit einer Bildschirm Lupe etwas nachhelfen :-). Technisch gesprochen wurden die ''hohen Frequenzen'' des orginalen Bildes nicht vor dem Verkleinern gefiltert, wodurch das Ergebnis durch [[Aliasing]] verfälscht wird.
+
Soll nun dieses Bild in 64x64 Pixeln dargestellt werden, so wird normalerweise einfach nur jede vierte horizontale Zeile und jede vierte vertikale Spalte angezeigt: [[Bild:Sf64u.jpg]] Man kann erkennen, dass das Resultat sehr ''pixelig'' aussieht (Für Menschen ohne 200% Sehschärfe vielleicht mit einer Bildschirm Lupe etwas nachhelfen :-). Technisch gesprochen wurden die ''hohen Frequenzen'' des originalen Bildes nicht vor dem Verkleinern gefiltert, wodurch das Ergebnis durch [[Aliasing]] verfälscht wird.
  
Beim Mipmapping werden nun verschiedene Versionen des orginalen Bildes im Speicher abgelegt, welche in der Regel jeweils um den Faktor 2 verkleinert sind. Die kleineren Bilder werden dabei jeweils korrekt ''Frequenz gefiltert'' verkleinert. Die einzelnen Verkleinerungsstufen nennt man dann '''MipMaps'''. Bei unserem Beispielbild würden folgende Bilder im Speicher abgelegt:
+
Beim Mipmapping werden nun verschiedene Versionen des originalen Bildes im Speicher abgelegt, welche in der Regel jeweils um den Faktor 2 verkleinert sind. Die kleineren Bilder werden dabei jeweils korrekt ''Frequenz gefiltert'' verkleinert. Die einzelnen Verkleinerungsstufen nennt man dann '''MipMaps'''. Bei unserem Beispielbild würden folgende Bilder im Speicher abgelegt:
  
 
[[Bild:Sf256.jpg]] 256x256
 
[[Bild:Sf256.jpg]] 256x256

Version vom 21. März 2012, 15:17 Uhr

Mip Mapping (MIP = multum in parvo = vieles im Kleinen), ist eine Technik welche die Darstellungsqualität von Bildern (Texturen) verbessert, wenn diese kleiner als in der ursprünglichen Größe dargestellt werden (bezogen auf die Auflösung des Bildes in Pixeln). Als angenehmer Nebeneffekt wird normalerweise auch weniger Rechenzeit benötigt, wenn ein Bild mit Hilfe von MipMaps verkleinert dargestellt wird. Dies wird jedoch durch einen vergrößerten Speicherplatzverbrauch zum Ablegen der MipMaps im Speicher (entweder Hauptspeicher oder Grafikkartenspeicher) erkauft.

Wird ein Bild ohne MipMaps verkleinert dargestellt, dann erscheint dieses Bild (besonders bei einer Animation) oft unruhig, da sich die einzelnen Pixel oft verändern. Den Effekt kann man mit Rauschen oder Krisseln beschreiben und ist in der Regel unerwünscht. Es rührt daher, dass durch die Verkleinerung ausgehend vom Originalbild die Frequenzen der Zeilen und Spalten nicht korrekt behandelt werden.

Soll aus den Texeln der Textur das Zielpixel berechnet werden, so wird man in der Regel mehrere Texel zur Berechnung verwenden (siehe bilineares Filtern). Benutzt man dabei statt der original Textur eine Mipmap so spricht man auch von trilinearer Filterung. Man kann die Ergebnisse des trinilearen Filterns sogar noch verbessern, indem man den anisotrophischen Filteralgorithmus verwendet. Das Gegenteil zum Mipmapping ist die Interpolation bei der Vergößerung von Bildern.

Beispiel

Dies ist das Bild in der originalen Größe von 256x256 Pixeln: San Francisco Skyline

Soll nun dieses Bild in 64x64 Pixeln dargestellt werden, so wird normalerweise einfach nur jede vierte horizontale Zeile und jede vierte vertikale Spalte angezeigt: Sf64u.jpg Man kann erkennen, dass das Resultat sehr pixelig aussieht (Für Menschen ohne 200% Sehschärfe vielleicht mit einer Bildschirm Lupe etwas nachhelfen :-). Technisch gesprochen wurden die hohen Frequenzen des originalen Bildes nicht vor dem Verkleinern gefiltert, wodurch das Ergebnis durch Aliasing verfälscht wird.

Beim Mipmapping werden nun verschiedene Versionen des originalen Bildes im Speicher abgelegt, welche in der Regel jeweils um den Faktor 2 verkleinert sind. Die kleineren Bilder werden dabei jeweils korrekt Frequenz gefiltert verkleinert. Die einzelnen Verkleinerungsstufen nennt man dann MipMaps. Bei unserem Beispielbild würden folgende Bilder im Speicher abgelegt:

Sf256.jpg 256x256

Sf128.jpg 128x128

Sf64.jpg 64x64

Sf32.jpg 32x32

Sf16.jpg 16x16

Sf8.jpg 8x8

(sowie die Größen 4x4, 2x2 und 1x1 Pixel)

Vergleicht man nun das Bild mit 64x64 Pixeln mit dem obigen (nicht korrekt) verkleinertem, so fällt auf, dass die zweite Version wesentlich glatter aussieht. Dies sind, wie oben erwähnt, die nicht mehr vorhandenen zu hohen Frequenzen.

Verkleinert auf 64x64 ohne Mipmapping
64x64 Mipmap
Man beachte die unsymetrischen Spitzen der Türme.

OpenGL-Funktionen

MipMaps können mit Hilfe der Funktion gluBuild1DMipmaps und gluBuild2DMipmaps einfach erzeugt werden, allerdings sind diese Funktionen recht langsam und man hat keinen Einfluss auf die Erstellung (und damit Qualität der MipMaps). Die MipMaps werden von der Funktion automatisch erzeugt und im Kontext der aktuellen mit glBindTexture gebundenen Textur aktiviert. Man kann die einzelnen Stufen der MipMap auch manuell erzeugen und an OpenGL übergeben, dazu ist der zweite Parameter (level) von glTexImage1D, glTexImage2D, glTexImage3D zu benutzen. Will man Mipmaps aus einer normalen Textur von OpenGL erzeugen lassen, kann dies durch das Setzen des "GENERATE_MIPMAP"-Flag in den Texture-Parameter vor dem Laden des Bildes mit glTexImage in den Mipmap-Level 0 geschehen. Die Veränderung des "Level 0"-Bildes, veranlasst OpenGL dann die anderen Mipmap-Level zu erzeugen/erneuern.

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, true);
glTexImage2D(GL_TEXTURE_2D,0, ... //Laden der Textur in den Level 0 

Eine Generierung mittels glTexParameter und glTexImage ist gluBuildMipmaps aus Performanzgründen vorzuziehen. glTexParameter bietet weitere interessante Optionen für die Verwendung/Beeinflussung von Mipmaps.

Eine performante Alternative ist es ein Texturformat zu verwenden, dass MipMaps direkt mitspeichert, wie es z.B. bei DDS der Fall ist. Dort werden die MipMaps beim Export aus dem Bildbearbeitungsprogramm in der Datei abgelegt (sofern man das wünscht) und man kann Einfluss auf deren Generation nehmen (wie sie gefiltert werden, wie viele Stufen abgelegt werden, alternativ kann man die MipMap-Stufen sogar selbst erstellen). Die MipMaps werden dann in der eigenen Anwendung direkt aus der Datei mitgeladen. Diese Methode ist flexibler und vor allem beim Laden sehr viel schneller.