Tipp 0463 Rendern in einer PictureBox (Windowed Mode)
Autor/Einsender:
Datum:
  Alexander Csadek
22.09.2005
Entwicklungsumgebung:
DirectX-Version:
  VB 6
DirectX 8
Inhaltlich ist dieser Tipp mit dem Tipp Bewegen im 3D-Raum identisch. Deshalb gehe ich hier nicht näher auf die Bewegung im 3D-Raum ein.
Dieser Tipp soll veranschaulichen, wie einfach es ist, Direct3D im Windowed Mode rendern zu lassen, also nicht im Vollbild (Fullscreen Mode). Damit ihr die Unterschiede leichter erkennen könnt, habe ich den gleichen Tipp als Grundlage verwendet.
Die wichtigste Änderung ist im Initialisierungs-Teil von DirectX und Direct3D (DX8Module.bas). Wir veranlassen den 3D-Device im Fenster (Windowed Mode) zu arbeiten und verwenden den aktuellen Bildschirm-Modus von Windows. Mehr ist nicht zu tun.
 
Public Function InitializationDX(ByVal hwnd As Long, _
        ByVal bolDebug As Boolean) As Boolean
  On Error Resume Next
  Set gDX8 = New DirectX8

  'Zugriff auf Direct3D holen
  Set gD3D8 = gDX8.Direct3DCreate()
  If gD3D8 Is Nothing Then Exit Function

  'Den aktiven Display-Modus holen
 
  'An dieser Stelle möchte ich euch darauf hinweisen,
  'dass nicht alle Grafikkarten unter Verwendung von DirectX
  'das aktuelle PixelFomart der Anzeige unterstützen.
  'Meine Grafikkarte unterstützt z. B. bei 1280 x 960 nur
  'die folgenden Formate: D3DFMT_X8R8G8B8 (32-bit True Color)
  'und D3DFMT_R5G6B5 (16-bit Color).
  'DirectX erstellt keinen Device, wenn der aktuelle
  'Windows-DisplayMode z. B. 24-bit True Color ist.

  Dim mode As D3DDISPLAYMODE
  gD3D8.GetAdapterDisplayMode D3DADAPTER_DEFAULT, mode

  'Festlegen der Darstellungs-Parameter (present)
  Dim d3dpp As D3DPRESENT_PARAMETERS
  d3dpp.Windowed = 1      '1=True, also im Fenster
  d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC

  'Display-Modus festlegen
  d3dpp.BackBufferFormat = mode.Format

  'Da wir nun eine komplexere Geometrie rendern wollen,
  'brauchen wir auch einen ZBuffer (Tiefenspeicher),
  'in unserem Fall einen mit 16 Bit Tiefe
  d3dpp.BackBufferCount = 1
  d3dpp.EnableAutoDepthStencil = 1
  d3dpp.AutoDepthStencilFormat = D3DFMT_D16

  'Device erstellen
  Set gD3DDevice8 = gD3D8.CreateDevice( _
          D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, _
          D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
  If gD3DDevice8 Is Nothing Then Exit Function

  'CullMode einschalten
  'Die Rückseiten der Dreiecke sollen nicht gerendert werden
  gD3DDevice8.SetRenderState D3DRS_CULLMODE, D3DCULL_CCW

  'ZBuffer (Tiefenspeicher) einschalten
  gD3DDevice8.SetRenderState D3DRS_ZENABLE, D3DZB_TRUE

  'Licht ausschalten, wir wollen Vertexe mit Farben rendern
  gD3DDevice8.SetRenderState D3DRS_LIGHTING, 0

  'Jetzt brauchen wir eine View-Matrix die unsere Position und
  'Orientierung der Kamera definiert.
  'Sie wird definiert durch einen Ausgangspunkt (auch Eye Point
  'genannt), einer Orientierung (auch LookAt genannt) und der
  'Angabe wo "oben" ist (Standard ist Y die Achse die "oben" ist).

  D3DXMatrixIdentity View3DMatrix
  D3DXMatrixLookAtLH View3DMatrix, vec3(0, 0, 0), _
            vec3(0, 0, 1000), vec3(0, 1, 0)
  gD3DDevice8.SetTransform D3DTS_VIEW, View3DMatrix

  'Neuen Ursprung der Viewport-Matrix einstellen
  gD3DDevice8.GetTransform D3DTS_VIEW, View3DMatrix
  TranslateMatrix View3DMatrix, vec3(PLAYER.X * -1, _
        PLAYER.Y * -1, PLAYER.Z * -1)
  gD3DDevice8.SetTransform D3DTS_VIEW, View3DMatrix

  'Die Projektionsmatrix beschreibt die Linse der Kamera.
  'Hiefür muss die Perspektive berücksichtigt werden (dies
  'braucht man generell in 3D, da ja das Bild zu einem 2D-Bild
  'umgerechnet werden muss und dabei die perspektivische
  'Verzerrung eine wichtige Rolle spielt). Als Standardwert
  'wird hier 1/4 von PI genommen, dieser Wert ist unser Sichtfeld
  '(Field of View).
  'Als nächstes brauchen wir das Seitenverhältnis (aspect ratio).
  'Man kann hier als Standard 1:1 nehmen, da unser Monitor aber
  'nicht quadratisch ist, wird das Bild verzerrt. So ähnlich wie
  'beim Fernseher mit dem 16:9 oder 4:3 Verhältnis.
  'Zum Schluss brauchen wir noch die Angabe, welche Vertexe sollen
  'Nahe und wie weit entfernt noch gerendert werden (near und
  'far clipping).

  Dim matProj As D3DMATRIX
  D3DXMatrixPerspectiveFovLH matProj, PI / 4, 0.77, 1, 1000
  gD3DDevice8.SetTransform D3DTS_PROJECTION, matProj

  'Erstellen eines D3DX8 Objektes
  Set gD3DX8 = New D3DX8

  'Zugriff auf das Sprite-Objekt
  'Dieses Objekt hilft uns bei der Darstellung von Bildern in 2D
  Set gD3DX8Sprite = gD3DX8.CreateSprite(gD3DDevice8)
  vecScalingDummy.X = 1: vecScalingDummy.Y = 1

  'DirectX 8 Font erzeugen
  Set myDXFont = CreateFont(frmMain.Font)
  InitializationDX = True
End Function
 
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  (297 kB) Downloads bisher: [ 416 ]

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: Sonntag, 4. September 2011