Tipp 0375 Direct3D - MipMap (Texturfilter)
Autor/Einsender:
Datum:
  Alexander Csadek
23.12.2003
Entwicklungsumgebung:
DirectX-Version:
  VB 6
DirectX 7
Der beliebteste Texturfilter ist ganz sicher MipMap, verbessert er doch gewaltig die Qualität einer gerenderten Szene.
MipMap steht für eine Reihe von Texturen der gleichen Bitmap mit abnehmender Auflösung. Es hilft die unschönen Artefakte verschwinden zu lassen, denn das Problem mit Texturen ist immer der Abstand des Betrachters zu ihnen. Je weiter der Betrachter sich von der Textur entfernt, desto mehr Farbwerte müssen zu einem Pixel zusammengerechnet bzw. gemischt werden. Dabei entstehen zwangsläufig die unschönen Artefakte.
MipMap verwendet eine Reihe der gleichen Textur mit unterschiedlichen Auflösungen. Angefangen bei der größten Auflösung z.B. 256 x 256 Pixel oder 128 x 128 Pixel und dann jeweils um die Hälfte verkleinert. So entsteht eine MipMap-Kette von fünf Texturen z.B. 128 x 128, 64 x 64, 32 x 32, 16 x 16, 8 x 8. Direct3D erkennt dann von selbst, welche der fünf Texturen verwendet werden muss. Je nach dem wie weit der Betrachter entfernt ist.
Die wichtige Änderung erfolgt im Codeteil für das Laden der Texturen, denn der Textursurface muss nun auch der Flag DDSCAPS_MIPMAP und DDSCAPS_COMPLEX zugewiesen werden. Der Flag DDSD_MIPMAPCOUNT ist auch wichtig, dann weiß Direct3D wie viele Level der MipMap-Filter hat. Beim Laden der Texturen muss darauf geachtet werden, dass mit der größten Auflösung begonnen wird, dann werden sie der Reihe nach bis zur kleinsten Auflösung geladen.
Beim eigentlichen Render-Vorgang muss so nur noch der MipMap-Filter eingeschaltet werden.
Es folgt nun der für diesen Tipp relevante Code...
 
>Public Sub Load_TEXTUR(ByVal FileName As String, _
      ByRef objDDSurface As DirectDrawSurface7)

  Dim TexDesc As DDSURFACEDESC2
  Dim TempMipMap As DirectDrawSurface7
  Dim TempSurface As DirectDrawSurface7
  Dim MipMapDesc As DDSURFACEDESC2
  Dim tempdesc As DDSURFACEDESC2
  Dim SourceRect As RECT
  Dim DestRect As RECT
  Dim DDSC As DDSCAPS2
  Dim Index As Integer

  With MipMapDesc
    .lFlags = DDSD_CAPS Or DDSD_MIPMAPCOUNT Or DDSD_WIDTH Or _
          DDSD_HEIGHT
    .lMipMapCount = 5
    .ddsCaps.lCaps = DDSCAPS_TEXTURE Or DDSCAPS_MIPMAP Or _
          DDSCAPS_COMPLEX
    .ddsCaps.lCaps2 = DDSCAPS2_TEXTUREMANAGE
    .lWidth = 128
    .lHeight = 128
  End With
  Set objDDSurface = DD7.CreateSurface(MipMapDesc)
  Set TempMipMap = objDDSurface

  Index = 0
  Do
    Dim newdesc As DDSURFACEDESC2
    TempMipMap.GetSurfaceDesc tempdesc
    newdesc.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or _
          DDSCAPS_SYSTEMMEMORY
    newdesc.lFlags = DDSD_CAPS
    Set TempSurface = DD7.CreateSurfaceFromFile(Left(FileName, _
      Len(FileName) - 4) & Trim$(Str$(Index)) & ".bmp", MipMapDesc)
    DestRect.Right = tempdesc.lWidth
    DestRect.Bottom = tempdesc.lHeight
    SourceRect.Right = newdesc.lWidth
    SourceRect.Bottom = newdesc.lHeight
    TempMipMap.Blt DestRect, TempSurface, SourceRect, DDBLT_WAIT
    DDSC.lCaps = DDSCAPS_MIPMAP Or DDSCAPS_TEXTURE

    On Local Error Resume Next
    Set TempMipMap = TempMipMap.GetAttachedSurface(DDSC)
    If Err.Number = DDERR_NOTFOUND Then Exit Do
    Index = Index + 1
  Loop

  Set TempSurface = Nothing
  Set TempMipMap = Nothing
End Sub

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

  If MipMapFilter Then
    Call Device.SetTextureStageState( _
          0, D3DTSS_MIPFILTER, D3DTFP_LINEAR)
  Else
    Call Device.SetTextureStageState( _
          0, D3DTSS_MIPFILTER, D3DTFP_NONE)
  End If

  Call Device.SetTextureStageState( _
        0, D3DTSS_MAGFILTER, D3DTFG_LINEAR)
  Call Device.SetTextureStageState( _
        0, D3DTSS_MINFILTER, D3DTFG_LINEAR)

  For i = 0 To GroupCount - 1
    Call Device.SetTexture(0, Groups(i).Texture)
    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
Texturen mit transparenter Farbe (ColorKey)
Texturfilter (point, linear, anisotropic)
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  (319 kB) Downloads bisher: [ 986 ]

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