Tuto direct3d 1 : initialisation

Description

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.

Codes Sources

A voir également

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.