vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Grafik und Font · DirectX   |   VB-Versionen: VB5, VB625.12.02
Textur-Filter und Mipmaps benutzen

Mit Textur-Filtern und Mipmaps lassen sich einige unschöne Efekte verhindern

Autor:   Marius SchmidtBewertung:  Views:  16.368 
www.matrixvb.da.ruSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11kein Beispielprojekt 

Nehmen wir einmal an, wir haben eine Wand, die wir aus sehr weiter Entfernung betrachten. Diese Wand stellt auf dem Bildschirm lediglich einen Bereich von ungefähr 20 pixeln dar, aber die Textur die auf diese Wand gelegt wurde ist 512x512 Pixel groß. Nun ist es logisch, dass die gesamten Informationen, die in der Textur gespeichert sind, auf einen so kleinen Bereich nicht komplett dargestellt werden können.

Deshalb benutzt man in Direct3D MipMaps ("Mip" ist lateinisch und bedeutet sowas wie "einer von vielen"). Beim Laden von Texturen erstellt D3DX standardmäßig eine ganze Reihe von Mipmaps, wenn man z.b. eine Textur mit einer Größe von 512x512 Pixeln lädt wird diese auch auf 256x256 Pixel verkleinert und auch auf 128x128 Pixel usw.... Je nach Distanz von der Kamera zum Objekt wird nun eine dieser Texturen ausgewählt und auf das Objekt gelegt. Wenn man direkt vor dem Objekt steht wird die Original-Textur verwendet.

Für Mipmaps gibt es außerdem noch mehrere unterschiedliche Filter, die verhindern, dass man den Übergang zwischen den MipMaps erkennt (beim Point-Filter erkennt man den Übergang allerdings sehr deutlich). D3D unterstützt einen Point-Filter, einen bilinearen Filter und natürlich einen anisotropischen Filter (dieser ist von Grafikkarte zu Graffikkarte leicht unterschiedlich, gilt aber als eine der besten Filterarten). Wie man diese aktiviert, zeigt nun nachfolgender Code:

' Point-MipMap-Filter für Textur-Stage 0 aktivieren
D3Ddevice.SetTextureStageState 0, D3DTSS_MIPFILTER, _
  D3DTEXF_POINT
 
' Linearen-MipMap-Filter für Texture-Stage 0 aktivieren
D3Ddevice.SetTextureStageState 0, D3DTSS_MIPFILTER, _
  D3DTEXF_LINEAR
 
' Anisotropischen-MipMap-Filter für Textur-Stage 0
' aktivieren
D3Ddevice.SetTextureStageState 0, D3DTSS_MIPFILTER, _
  D3DTEXF_ANISOTROPIC

MipMaping reicht allerdings für eine weiche und korekte Darstellung der Texturen nicht aus. Meistens benutzt man zum MipMaping auch noch einen Textur-Filter. Dieser Filter sorgt dafür, dass Texturen mit niedriger Auflösung nicht aussehen wie Pixel-Klötze und Texturen mit zu hoher Auflösung keinen "Krisseleffekt" haben. Meistens benutzt man für den Textur-Filter die gleiche Filterart wie beim MipMaping-Filter.

Um den Textur-Filter zu aktivieren muss man 2 Filter setzen: einmal für nahe Pixel und einmal für ferne Pixel. Manchmal lohnt es sich für die Geschwindigkeit zwei unterschiedliche Filter zu setzen (z.b. für nahe Objekte einen linearen Filter und für ferne Objekte einen Point-Filter)

D3DTSS_MAGFILTER - Der Filter für weit entfernte Pixel
D3DTSS_MINFILTER - Der Filter für nahe Pixel

' Point Textur-Filter für Textur-Stage 0 aktivieren
D3Ddevice.SetTextureStageState 0, D3DTSS_MAGFILTER, _
  D3DTEXF_POINT
D3Ddevice.SetTextureStageState 0, D3DTSS_MINFILTER, _
  D3DTEXF_POINT
 
' Linearen Textur-Filter für Textur-Stage 0 aktivieren
D3Ddevice.SetTextureStageState 0, D3DTSS_MAGFILTER, _
  D3DTEXF_LINEAR
D3Ddevice.SetTextureStageState 0, D3DTSS_MINFILTER, _
  D3DTEXF_LINEAR
 
 
' Beim Anisotropischen-Filter gibt es noch eine
' Besonderheit. Man muss auch den TextureStageState
' D3DTSS_MAXANISOTROPY setzen: hierzu muss man
' zunächst die DeviceCaps ermitteln
Dim caps As D3DCAPS8
 
D3Ddevice.GetDeviceCaps caps
D3Ddevice.SetTextureStageState 0, D3DTSS_MAGFILTER, _
  D3DTEXF_ANISOTROPIC
D3Ddevice.SetTextureStageState 0, D3DTSS_MINFILTER, _
  D3DTEXF_ANISOTROPIC
D3Ddevice.SetTextureStageState 0, D3DTSS_MAXANISOTROPY, _
  caps.MaxSimultaneousTextures

Der Unterschied zwischen den Filtern lässt sich meist sofort erkennen. Es ist deshalb unbedingt notwendig beide Filter zu setzen und vielleicht auch ein bisschen auszuprobieren was am besten aussieht. Um die Qualität der MipMaps zu verringern (z.b. für mehr Geschwindigkeit) oder zu erhöhen gibt es noch einen TextureStageState namens D3DTSS_MIPMAPLODBIAS. Mit dieser Einstellung lässt sich die Distanz, bei der das MipMaping beginnt, verändern. Ein negativer Wert würde bedeuten, dass bei geringer Distanz bereits eine niedrigauflösende MipMap-Textur verwendet wird, ein höherer Wert würde bedeuten, dass bei hoher Distanz eine hoch-auflösende MipMap-Textur verwendet wird. Diese Einstellung erfordert einen Fließkommawert (Single). Da die SetTextureStageState-Funktion aber nur Long-Werte akzeptiert, muss man den Fließkommawert zuvor mit einer Funktion umwandeln:

Dim fBias As Single
Dim lngBias As Long
' MipMap-Qualität erhöhen
fBias = -1
 
' Fließkommawwert in einen Ganzzahlwert konvertieren
DXCopyMemory lngBias, fBias, 4
D3Ddevice.SetTextureStageState 0, D3DTSS_MIPMAPLODBIAS, _
  lngBias
' MipMap-Qualität verringern
fBias = 1
 
' Fließkommawert in einen Ganzzahlwert konvertieren
DXCopyMemory lngBias, fBias, 4
D3Ddevice.SetTextureStageState 0, D3DTSS_MIPMAPLODBIAS, _
  lngBias



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.