Question

Je suis tout à fait nouveau DirectX et je voudrais tirer quelques primitives non transformées avec la configuration de Direct3D les plus élémentaires (à des fins d'apprentissage). Je l'ai déjà dessiné quelques primitives avec des sommets transformés, qui est sommets avec l'indicateur de D3DFVF_XYZRHW.

Maintenant, je suis en train d'obtenir la même sortie avec des sommets non transformées, mais je ne reçois pas de visuels à l'écran. J'ai changé FVF et ajusté les sommets, mais n'a pas encore défini de matrice de transformation (monde, vue, projection) encore. Est-il nécessaire de mettre l'une de ces matrices? Je suppose que tout fonctionnerait comme avec des sommets transformés lorsqu'aucun matrices sont définies, mais évidemment ce n'est pas le cas.

Quelle est la zone (en coordonnées-monde) 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 d'avance!

EDIT: Maintenant, je l'ai eu, l'éclairage a été activé, l'erreur de débutant stupide. Merci pour votre aide quand même!

Était-ce utile?

La solution

Eh bien, si vous définissez l'identité de votre monde, vue et projection des matrices alors ce que vous obtiendrez est une passe simple grâce.

x va aller de -1 à 1
y va varier de -1 à 1
z va aller de 0 à 1 (Ce bit peut causer des problèmes).

Si vous définissez ensuite standards non transformées et verts de les transmettre à l'intérieur de cette plage, ils affichent à l'écran.

Si cela ne vous aide pas afficher un code et je vais voir ce que je peux suggérer.

Edit: Avez-vous Z-Buffering activé? Parce que vous ne désactivez pas votre Z-buffer qui pourrait causer des problèmes bizarres. Tout va rendre derrière cela et par conséquent ne sera 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 bien la peine d'apprendre comment utiliser PIX et voir ce qui se passe à votre triangle car il passe par la scène.

Edit2:

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

soit

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.

Autres conseils

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top