2009-08-28 6 views
0

Je suis absolument nouveau dans DirectX et j'aimerais dessiner des primitives non-transformées avec la configuration Direct3D la plus basique (à des fins d'apprentissage). J'ai déjà dessiné des primitives avec des sommets transformés, c'est-à-dire des sommets avec le jeu de drapeaux D3DFVF_XYZRHW.Dessin de vertex transformé le plus basique avec Direct3D

Maintenant, j'essaie d'obtenir la même sortie avec des sommets non transformés, mais je n'ai aucun visuel sur l'écran. J'ai changé ma FVF et ajusté les sommets mais je n'ai pas encore défini de matrice de transformation (monde, vue, projection). Est-il nécessaire de définir l'une de ces matrices? Je supposerais que tout fonctionnerait comme avec des sommets transformés quand aucune matrice n'est définie, mais évidemment ce n'est pas le cas.

Quelle zone (en coordonnées mondiales) est visible par défaut? Que dois-je faire pour le faire fonctionner?

Ceci est essentiellement ce que je fais:

struct Vertex 
{ 
    float x, y, z; 
    D3DCOLOR color; 

    static const DWORD format = D3DFVF_XYZ | D3DFVF_DIFFUSE; 
}; 


const Vertex vertices[] = { 
          {0.0f, 0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}, 
          {0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}, 
          {-0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)} 
          }; 


pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, Vertex::format, D3DPOOL_DEFAULT, &pVB, NULL); 

VOID* vertexData = 0; 
pVB->Lock(0, sizeof(vertices), &vertexData, 0); 
memcpy(vertexData, vertices, sizeof(vertices)); 
pVB->Unlock(); 



D3DMATRIX matrixIdentitiy; 
ZeroMemory(&matrixIdentitiy, sizeof(matrixIdentitiy)); 
matrixIdentitiy._11 = 1.0f; 
matrixIdentitiy._22 = 1.0f; 
matrixIdentitiy._33 = 1.0f; 
matrixIdentitiy._44 = 1.0f; 

pd3dDevice->SetTransform(D3DTS_WORLD, &matrixIdentitiy); 
pd3dDevice->SetTransform(D3DTS_VIEW, &matrixIdentitiy); 
pd3dDevice->SetTransform(D3DTS_PROJECTION, &matrixIdentitiy); 



pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 0.0f, 0); 
pd3dDevice->BeginScene(); 

pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); 
pd3dDevice->SetRenderState(D3DRS_CLIPPING, FALSE); 
pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); 

pd3dDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex)); 
pd3dDevice->SetFVF(Vertex::format); 
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); 

pd3dDevice->EndScene(); 
pd3dDevice->Present(NULL, NULL, NULL, NULL); 

Merci à l'avance!

EDIT: Maintenant je l'ai eu, l'éclairage a été activé, l'erreur du débutant stupide. Merci pour votre aide de toute façon!

Répondre

1

Eh bien, si vous définissez votre monde, la vue et les matrices de projection à l'identité, alors ce que vous obtiendrez est un simple passage à travers.

x varieront de -1 à 1
y sera comprise de -1 à 1
z vont de 0 à 1 (Ce bit peut causer des problèmes). Si vous définissez ensuite des vert standards non transformés et que vous les transmettez à l'intérieur de cette plage, ils s'afficheront à l'écran.

Si cela n'aide pas à poster du code et je verrai ce que je peux suggérer.

Éditer: Avez-vous activé Z-Buffering? Parce que vous n'effacez pas votre Z-buffer qui pourrait causer des problèmes étranges. Tout sera rendu derrière cela et ne sera donc jamais rendu.

Set

pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); 

ou

pd3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); 

pour tester cette hypothèse.

Il est également très intéressant d'apprendre à utiliser PIX, puis de voir ce qui arrive à votre triangle pendant qu'il traverse la scène.

Edit2:

Il est possible que votre problème vient de l'éclairage. Essayez de mettre l'éclairage hors

-à-dire

pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); 

Essayez également de changer votre Effacer à ceci:

pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0); 

et vérifiez si vos polys sont rendu noir.

+0

Bon point, j'ai désactivé le test z-buffer, mais le problème reste. –

0

Ceci est essentiellement ce que je fais:

struct Vertex 
{ 
    float x, y, z; 
    D3DCOLOR color; 

    static const DWORD format = D3DFVF_XYZ | D3DFVF_DIFFUSE; 
}; 


const Vertex vertices[] = { 
          {0.0f, 0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}, 
          {0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}, 
          {-0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)} 
          }; 


pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, Vertex::format, D3DPOOL_DEFAULT, &pVB, NULL); 

VOID* vertexData = 0; 
pVB->Lock(0, sizeof(vertices), &vertexData, 0); 
memcpy(vertexData, vertices, sizeof(vertices)); 
pVB->Unlock(); 



D3DMATRIX matrixIdentitiy; 
ZeroMemory(&matrixIdentitiy, sizeof(matrixIdentitiy)); 
matrixIdentitiy._11 = 1.0f; 
matrixIdentitiy._22 = 1.0f; 
matrixIdentitiy._33 = 1.0f; 
matrixIdentitiy._44 = 1.0f; 

pd3dDevice->SetTransform(D3DTS_WORLD, &matrixIdentitiy); 
pd3dDevice->SetTransform(D3DTS_VIEW, &matrixIdentitiy); 
pd3dDevice->SetTransform(D3DTS_PROJECTION, &matrixIdentitiy); 



pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 0.0f, 0); 
pd3dDevice->BeginScene(); 

pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); 
pd3dDevice->SetRenderState(D3DRS_CLIPPING, FALSE); 

pd3dDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex)); 
pd3dDevice->SetFVF(Vertex::format); 
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); 

pd3dDevice->EndScene(); 
pd3dDevice->Present(NULL, NULL, NULL, NULL); 
+0

Ce n'est pas une réponse, cela fait partie de la question! Le texte devrait être édité dans la question, et la réponse supprimée. – unwind

+0

D'accord, mais il n'y a pas de lien de suppression. –