A la demande de Benjionline j'ai ecris ce tutorial qui traite de l'initialisation de Direct3D.
J'espere ne pas avoir fait d'erreurs, si c'etait le cas merci de me le faire savoir par un commentaire.
Je met le tutoriel dans la partie source et un code d'exemple. La source n'est pas commenté car ce n'est que la reprise du tutoriel.
Source / Exemple :
Initialisation de Direct3D
Direct3D est une librairie de DirectX, ici nous utiliserons DirectX 8. Direct3D va nous permettre de faire des affichages d'objets en 3 dimensions et de les projetés sur l'écran.
Dans ce tutorial je vais tenter de vous expliquer les bases Direc3D.
Pour ce tutorial il faudra disposer d'une form et d'un control PictureBox nommé Picture1
En premier lieu nous allons déclarer l'ensemble des variables que nous utiliserons
Private Declare Function GetActiveWindow Lib "user32" () As Long
'On utilisera cette fonction pour faire une petite optimisation
Private PDirectX As New DirectX8 'Pour créer un contexte de Rendu 3d
Private PDirect3D As Direct3D8 'Pour utiliser le contexte de Rendu
Private PDevice As Direct3DDevice8 'Correspond au material d'affichage
Private PStructParameter As D3DPRESENT_PARAMETERS 'Parametre d'affichage
Private MatWorld As D3DMATRIX 'La matrice d'affichage de notre monde 3d
Private MatView As D3DMATRIX 'Ma matrice de visualisation de notre monde
Private MatProj As D3DMATRIX 'La matrice de projection de notre monde sur l'ecran
Private poscam As D3DVECTOR 'Position de la caméra
Private dircam As D3DVECTOR 'Direction du regard de la caméra
Private percam As D3DVECTOR 'Vers ou est le haut de la camera
Private RenduD3D as Boolean 'Booleen pour créer une boucle d'ffichage
Pour réaliser un affichage de notre monde 3d nous utiliserons une caméra cette caméra est basé sur l'utilisation d'une matrice : MatView. Elle correspond a ce que voie la caméra.
Pour afficher ce que voie la caméra sur notre ecran nous utiliserons une autre matrice, la matrice de projection MatProj. Enfin nous utiliserons une matrice MatWorld qui correspondra a la position de notre monde 3D.
Pour créer notre caméra nous utiliserons 3 vecteurs, poscam qui correspond a la position de la camera dans notre monde en faite c'est plus un point qu'un vecteur, dircam qui correspond a la direction, en gros vers ou regarde la camera, et enfin percam qui montre le sommet de la caméra.
Un schema sera peut etre plus parlant :
http://img129.imageshack.us/img129/9377/poscambc8.png
Passons maintenant à l'initialisation de Direct3D, pour ce faire nous ajoutons une fonction :
Private Sub InitD3D(hWnd As Long, FullScreen As Boolean)
'hWnd correspond au hWnd d'affichage et FullScreen permet d'intialiser selon un affichage plein
'ecran ou un affichage fenetré
Dim mode As D3DDISPLAYMODE
'Cette variable va nous servir a stocker les parametres d'affichages de notre ordinateur pour la
'configuration de directx
Set PDirect3D = PdirectX.Direct3DCreate() 'On initialise un contexte de rendu 3d
PDirect3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, mode
'Ici nous récupérons dans notre variable mode les différents parametres d'affichages de notre
'ordinateur
With PstructParameter 'Initialisation de l'affichage
.BackBufferCount = 1 'Un backbuffer
.AutoDepthStencilFormat = D3DFMT_D16
'On utilise un tampon de pronfondeur en 16 couleurs
.EnableAutoDepthStencil = 1 'On active le tampon de profondeur
.BackBufferFormat = mode.Format 'Pour le BackBuffer on utilise le format recupéré
.hDeviceWindow = hWnd 'On utilise le hWnd passé en parametre
.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC 'On utilise la synchronisation verticale
End With
If FullScreen Then 'Si on est en plein ecran on passe en mode plein ecran
PStructParameter.Windowed = False
Else
PStructParameter.Windowed = True
End If
Set PDevice = PDirect3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, _
D3DCREATE_SOFTWARE_VERTEXPROCESSING, PStructParameter)
'On initialise le Device avec des parametres standard et notre structure paramétré ci-dessus.
' D3DDEVTYPE_HAL permet l'utilisation de la carte graphique pour les calculs
D3DXMatrixPerspectiveFovLH MatProj, 3.141592654 / 4, 1, 1, 10000
'On créer la matrice de projection d'angle de champ de vision pi / 4 qui est une valeur
'generalement utilisé et dimension Width / Height avec en premier plan 1 et en dernier plan 1000
PDevice.SetTransform D3DTS_PROJECTION, MatProj
'On créer la transformation lié a la matrice
'On positionne notre caméra
poscam.x = 0
poscam.y = 0
poscam.z = 100
dircam.x = 0
dircam.y = 0
dircam.z = 0
percam.x = 0
percam.y = 1
percam.z = 0
'On met notre booleen a vrai
RenduD3D = True
Call Rendu(hWnd)
End Sub
Maitenant passons a notre fonction de Rendu :
Private Sub Rendu(hWnd as long)
If PDevice Is Nothing Then Exit Sub 'Si le device n'est pas initaliser on quitte
While RenduD3D 'Tant que notre booleen est vrai
DoEvents 'On laisse le processeur traiter les evenements systemes
PDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HBBCCFF, 2, 1
'On vide l'ecan
Matrice 'On appel la fonction Matrice que l'on va decrire ci-dessous
Pdevice.BeginScene 'On commence le rendu de la scene
Pdevice.EndScene 'On fini le rendu de la scene
PDevice.Present ByVal 0, ByVal 0, 0, ByVal 0 'On affiche l'image a l'ecran
If GetActiveWindow <> hWnd Then 'Ici on teste si notre fenetre est affiché en premiere
RenduD3D = False 'Dans le cas contraire on arrete le rendu
Form1.Timer1.Enabled = True 'et on active un timer
End If
Wend
End Sub
Enfin la procédure Matrice :
Private Function Matrice()
D3DXMatrixIdentity MatWorld
PDevice.SetTransform D3DTS_WORLD, MatWorld 'On applique les transformation lié au
'monde
D3DXMatrixLookAtLH MatView, poscam, dircam, percam
PDevice.SetTransform D3DTS_VIEW, MatView
'On applique les transformations liés a la matrice de visualisation
End Function
Enfin il faut mettre dans le Form_Load le chargement de notre code :
InitD3D Picture1.hWnd, False, Picture1.Width, Picture1.Height
Petite precision le ScaleMode de notre PictureBox doit etre en pixel.
Notre Timer, il est fixé a un interval de 500ms et a False
Private Sub Timer1_Timer()
If GetActiveWindow = Form1.hWnd Then 'Si notre fenetre est active
RenduD3D = True 'on remet le rendu a true
Timer1.Enabled = False 'On desactive le timer
Call Rendu(Form1.hWnd) 'on relance le rendu
End If
End Sub
J'espere que cette petite explication aura était explicite sur tous les points.
Conclusion :
Le prochain tutorial traitera de l'affichage d'objet, des textures, et des deplacements dans le monde 3d.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.