Domanda

Sono assolutamente nuovi per DirectX e vorrei trarre alcune primitive non trasformate con la configurazione di base Direct3D (a fini di apprendimento). Ho già disegnato alcune primitive con vertici trasformate, cioè vertici con il set D3DFVF_XYZRHW bandiera.

Ora sto cercando di ottenere lo stesso risultato con vertici non trasformati, ma non si ottiene alcun immagini sullo schermo. Ho cambiato il mio FVF e regolato i vertici, ma non ho impostato alcuna matrice di trasformazione (mondo, vista, proiezione) ancora. E 'necessario impostare una di queste matrici? Mi piacerebbe pensare che tutto avrebbe funzionato proprio come con i vertici trasformati quando sono impostati senza matrici, ma ovviamente non è questo il caso.

Cosa zona (nel mondo coordinate) è visibile di default? Cosa devo fare per farlo funzionare?

Questo è fondamentalmente quello che faccio:

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

Grazie in anticipo!

EDIT: Ora ho capito, l'illuminazione è stata attivata, errore stupido di principiante. Grazie per l'aiuto comunque!

È stato utile?

Soluzione

Beh, se si impostano i mondiali, visualizzare e proiezione matrici all'identità allora quello che si ottiene è un semplice passaggio attraverso.

x spazierà tra -1 e 1
y varieranno da -1 a 1
z va da 0 a 1 (Questo bit può causare problemi).

Se poi si definisce verts non trasformati standard e li passa all'interno di tale intervallo si visualizzerà sullo schermo.

Se questo non aiuta inviare un po 'di codice e vedrò cosa posso suggerire.

Edit: Hai Z-buffer abilitato? Perché non si svuota la Z-buffer che potrebbe causare problemi dispari. Tutto renderà alla base di questo e, quindi, non potrà mai rendere.

Set

pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );

o

pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );

per verificare questa ipotesi.

E 'anche molto vale la pena imparare a usare PIX e poi vedere cosa succede al tuo triangolo come va attraverso la scena.

Edit2:

E 'possibile che il tuo problema è venuta da illuminazione. Provare a girare di illuminazione spento

es

pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

Prova anche a cambiare la vostra chiara a questa:

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

E controllare per vedere se i vostri poligoni sono rendering nero.

Altri suggerimenti

Questo è fondamentalmente quello che faccio:

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top