|
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
|
|