Tipp 0383 Texturfilter (point, linear, anisotropic)
Autor/Einsender:
Datum:
  Alexander Csadek
13.02.2004
Entwicklungsumgebung:
DirectX-Version:
  VB 6
DirectX 7
Da Direct3D den 3D-Raum auf den zweidimensionalen Bildschirm rendert, kommt es bei den Texturen zu unschönen Effekten. Besonders dann, wenn die Textur verkleinert bzw. vergrößert wird. Dazu kommt noch, dass die Textur ja perspektivisch auf das Polygon gerendert werden muss.
Je näher man z.B. einer Wand kommt, desto größer werden die einzelnen Farbblöcke, und irgendwann reicht ein Pixel nicht mehr aus. Direct3D muss nun entscheiden, wie dieser Pixel-Block eingefärbt werden muss. Umgekehrt entsteht das gleiche Problem, je weiter wir von der Wand weggehen, desto kleiner wird die Textur, und Direct3D muss entscheiden, welche Pixel sind zu sehen und welche nicht. Die daraus entstehenden Ungenauigkeiten (visuelle Artefakte) können mit dem Einsatz von Textur-Filtern minimiert werden.
Nearest Point Sampling
Diese Technik, falls man hierbei überhaupt von Technik sprechen kann, ist sehr alt und funktioniert auf der Basis der Ganzzahlkoordinaten der Pixel am Bildschirm. So werden die Fliesskommawerte im 3D einfach aufgerundet und das entsprechende Farb-Pixel von der Textur genommen. Dieser Vorgang ist sehr schnell, aber die unschönen Artefakte können damit kaum verhindert werden. Im Direct3D ist dieser Texturfilter standardmäßig eingestellt, da so gut wie jede Grafikkarte diesen Filter unterstützt.
Linear Filter
Diese Technik ist auch als bilinearer Filter bekannt. Sie verbessert die Qualität deutlich, und wird von den Spiele-Herstellern meistens verwendet. Wenig detaillierte Texturen können bei dieser Technik verwaschen wirken, ein Effekt, der durch detailliertere Texturen kompensiert wird. Im Prinzip basiert diese Technik auf einem Weichzeichner. 
Die Farbwerte jedes Pixels werden zerlegt und mit den Farbwerten der Nachbarpixel vermischt. Die Hardware muss hierbei mehr berechnen als beim Nearest Point Filter und sollte eine Grafikkarte lineares Filtern nicht unterstützen, ist mit einem Performance-Verlust zu rechnen. Bei den modernen Grafikkarten ist dies eher unwahrscheinlich.
Ein optimales Ergebnis wird mit diesem Filter erreicht wenn ein Polygon senkrecht zum Betrachter im 3D-Raum steht, dies kommt wohl eher sehr selten vor, aber das Ergebnis ist trotzdem um einiges besser als das vom Nearest Point Filter.
Anisotropic Filter (uneinheitlicher Filter)
Da für diese Technik kein einheitlicher Algorithmus verwendet wird, ist das Ergebnis von der Grafikkarte abhängig und vom Algorithmus den der Hersteller bei diesem Filter verwendet. So kann es passieren, dass bei manchen Grafikkarten das Ergebnis schlechter als beim linearen Filter ist. In der Regel wird bei dieser Technik die Interpolation der neuen Pixel-Farbe an unregelmäßigen Formen durchgeführt, und nicht wie beim linearen Filter an viereckigen Pixel-Bereichen. Der anisotropische Filter berücksichtigt die perspektivischen Verzerrungen. Wie gesagt, das Ergebnis hängt von der verwendeten Grafikkarte ab.
Die vierte Textur-Filtertechnik wird im Tipp MipMap (Texturfilter) veranschaulicht und erklärt.
Es folgt nun der für diesen Tipp relevante Code...
 
Public Sub Render3D()
  Dim i As Integer

  Device.Clear 1, ClearRec(), D3DCLEAR_TARGET Or _
      D3DCLEAR_ZBUFFER, DX7.CreateColorRGB(0, 0, 0), 1, 0
  Device.BeginScene

  'Alle Gruppen (Meshes) aus dem XFile rendern
  For i = 0 To GroupCount - 1
    Call Device.SetTexture(0, Groups(i).Texture)

    'Textur-Filter einstellen
    Call Device.SetTextureStageState( _
          0, D3DTSS_MAGFILTER, TexturFilter)
    If TexturFilter = D3DTFG_ANISOTROPIC Then _
      Call Device.SetTextureStageState(0, D3DTSS_MAXANISOTROPY, 2)
    Call Device.SetTextureStageState( _
          0, D3DTSS_MINFILTER, TexturFilter)
    If TexturFilter = D3DTFG_ANISOTROPIC Then _
      Call Device.SetTextureStageState(0, D3DTSS_MAXANISOTROPY, 2)
      Call Device.DrawPrimitive(D3DPT_TRIANGLELIST, _
           D3DFVF_LVERTEX, Groups(i).RenderVertexList(0), _
           UBound(Groups(i).RenderVertexList) + 1, D3DDP_WAIT)
  Next

  Device.EndScene
End Sub
 
Weitere Links zum Thema
Textur-Animation
Textur-Blending (einfach)
Texturen mit transparenter Farbe (ColorKey)
Hinweis
Um dieses Beispiel ausführen zu können, wird die DirectX 7 for Visual Basic Type Library benötigt (siehe dazu die Erläuterungen in der DirectX-Rubrik).

Windows-Version
95
98/SE
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (187 kB) Downloads bisher: [ 969 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Dienstag, 30. August 2011