Tipp 0466 Himmel (SkyBox)
Autor/Einsender:
Datum:
  Alexander Csadek
1.11.2005
Entwicklungsumgebung:
DirectX-Version:
  VB 6
DirectX 8
Es gibt mehrere Möglichkeiten in einer 3D-Umgebung (Map) einen realistischen Himmel darzustellen. Eine sehr beliebte Variante ist die SkyBox, bei der die Innenseiten eines Würfels mit einer entsprechenden Textur belegt werden. In diesen Würfel wird dann die eigentliche Map gesetzt. Diese Lösung benötigt relativ wenige Polygone, wobei so natürlich der Himmel nur schwer animiert werden kann. Legt man hingegen den Himmel auf die Innenseite einer Halbkugel, ist eine Animation des Himmels weitaus einfacher. Diese Lösung ist jedoch sehr rechenintensiv, da sehr viele Polygone benötigt werden.
Map-Designer verwenden auch gerne einfach nur eine Fläche über dem Spieler, die sie entsprechend groß einstellen und grenzen die Umgebung mit Mauern, Bergen usw. so ein, so dass der Spieler nie den wirklichen Horizont sehen kann.
Etwas muss allerdings bei allen Varianten bedacht werden, die Himmels-Textur muss entsprechend gut sein, damit keine Übergänge zu sehen sind. Programme wie Corel Bryce oder Terragen sind da sehr hilfreich.
Dieser Tipp zeigt euch, wie eine SkyBox in Direct3D realisiert werden kann. Dabei solltet ihr beachten, dass die Texturkoordinaten beim Rendern innerhalb der Textur bleiben, da ansonsten unschöne Ränder entstehen können, beispielweise wenn ein Texel genau den Rand der Textur trifft. Auch ein linearer Textur-Filter lässt den Himmel nicht gar so gerastert erscheinen.
Code für den Render-Bereich
 
Private Sub Render3D()
  On Error GoTo ErrOut
  If gD3DDevice8 Is Nothing Then Exit Sub

  'Bereinigen des BackBuffers und des ZBuffers
  gD3DDevice8.Clear 0, ByVal 0, D3DCLEAR_TARGET Or _
        D3DCLEAR_ZBUFFER, 0#, 1#, 0

  'Szene beginnen
  gD3DDevice8.BeginScene

  'Vertex Format setzen
  gD3DDevice8.SetVertexShader D3DFVF_LVERTEX

  'TexturKoordinaten ausserhalb der Textur werden nicht
  'gespiegelt
  gD3DDevice8.SetTextureStageState 0, D3DTSS_ADDRESSU, _
        D3DTADDRESS_CLAMP
  gD3DDevice8.SetTextureStageState 0, D3DTSS_ADDRESSV, _
        D3DTADDRESS_CLAMP

  'Bilinearen Texturfilter verwenden, damit die Skybox nicht so
  'grob gerastert wird
  gD3DDevice8.SetTextureStageState 0, D3DTSS_MAGFILTER, _
        D3DTEXF_LINEAR

  'Textur setzen
  gD3DDevice8.SetTexture 0, texSkyBox(0)

  'Vertexe rendern
  gD3DDevice8.DrawPrimitiveUP D3DPT_TRIANGLELIST, 2, _
        vxSkyBox(0), Len(vxSkyBox(0))
  gD3DDevice8.SetTexture 0, texSkyBox(1)
  gD3DDevice8.DrawPrimitiveUP D3DPT_TRIANGLELIST, 2, _
        vxSkyBox(6), Len(vxSkyBox(0))
  gD3DDevice8.SetTexture 0, texSkyBox(2)
  gD3DDevice8.DrawPrimitiveUP D3DPT_TRIANGLELIST, 2, _
        vxSkyBox(12), Len(vxSkyBox(0))
  gD3DDevice8.SetTexture 0, texSkyBox(3)
  gD3DDevice8.DrawPrimitiveUP D3DPT_TRIANGLELIST, 2, _
        vxSkyBox(18), Len(vxSkyBox(0))
  gD3DDevice8.SetTexture 0, texSkyBox(5)
  gD3DDevice8.DrawPrimitiveUP D3DPT_TRIANGLELIST, 2, _
        vxSkyBox(24), Len(vxSkyBox(0))
  gD3DDevice8.SetTexture 0, texSkyBox(4)
  gD3DDevice8.DrawPrimitiveUP D3DPT_TRIANGLELIST, 2, _
        vxSkyBox(30), Len(vxSkyBox(0))

  'Mit der Draw-Methode des D3DX8Sprite-Objektes Fadenkreuz
  'zeichnen
  Call gD3DX8Sprite.Draw(texFadenkreuz, recFadenkreuz, _
        vecScalingDummy, vecRotationCenterDummy, 0, _
        vecFadenkreuz, lngColorDummy)

  'Text zeichnen
  myDXFont.DrawTextW strText, Len(strText), recText, _
        DT_WORDBREAK, D3DColorMake(1, 1, 1, 1)

  'Szene beenden
  gD3DDevice8.EndScene

  'Kompletten BackBuffer zum FrontBuffer kopieren
  gD3DDevice8.Present ByVal 0, ByVal 0, 0, ByVal 0

  Exit Sub

ErrOut:
  Debug.Print Err.Number & " - " & Err.Description
End Sub
 
Hinweis
Um dieses Beispiel ausführen zu können, wird die DirectX 8 for Visual Basic Type Library benötigt (siehe dazu die Erläuterungen in der DirectX-Rubrik).

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


Download  (258 kB) Downloads bisher: [ 483 ]

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