Frage

Ich bin absolut neu zu DirectX und ich mag einige untransformierten Primitiven mit der grundlegendsten Direct3D Konfiguration ziehen (zu Lernzwecken). Ich zog bereits einige Grundelemente mit transformierten Scheitelpunkte, das Eckpunkte mit dem D3DFVF_XYZRHW-Flag gesetzt ist.

Jetzt versuche ich, die gleiche Leistung mit nicht transformierten Scheitelpunkten zu bekommen, aber ich bekomme kein Visuals auf dem Bildschirm. Ich änderte meine FVF und die Ecken angepasst, aber nicht jede Transformationsmatrix (Welt, Ansicht, Projektion) noch festgelegt. Ist es notwendig, jede dieser Matrizen zu setzen? Ich würde davon ausgehen, dass alles funktionieren würde, wie mit transformierten Scheitelpunkte, wenn keine Matrizen eingestellt sind, aber offensichtlich, dass das nicht der Fall ist.

Was Bereich (in Weltkoordinaten) ist standardmäßig sichtbar? Was muss ich tun, um es Arbeit zu machen?

Dies ist im Grunde, was ich tue:

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

Vielen Dank im Voraus!

EDIT: Nun ich habe es, Beleuchtung aktiviert war, Fehler dumm Anfänger. Danke für Ihre Hilfe sowieso!

War es hilfreich?

Lösung

Nun, wenn Sie Ihre Welt, Ansicht und Projektionsmatrizen auf Identität legen Sie dann, was Sie bekommen ist ein einfacher Durchlauf durch.

x liegt im Bereich von -1 bis 1 | y wird von -1 bis 1 | reichen z wird im Bereich von 0 bis 1 (Dieses Bit kann zu Problemen führen).

Wenn Sie dann Standard untransformierten verts definieren und geben sie an nach innen, dass sie im Bereich werden auf dem Bildschirm angezeigt werden.

Wenn das nicht hilft Post auf einige Code, und ich werde sehen, was ich vorschlagen kann.

Edit: Haben Sie Z-Buffering aktiviert? Weil Sie nicht Ihre löschen Z-Puffer, der ungerade Probleme verursachen könnte. Alles wird dahinter machen und wird daher nie machen.

Set

pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );

oder

pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );

Um diese Hypothese zu testen.

Es ist auch sehr viel wert Lernen, wie man PIX verwenden und dann zu sehen, was zu Ihrem Dreieck geschieht, wie es durch die Szene geht.

Edit2:

Es ist möglich, dass Ihr Problem von der Beleuchtung kommt. Versuchen Sie drehen Beleuchtung aus

dh

pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

Versuchen Sie auch Ihre Löschen, um diese zu ändern:

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

Und überprüfen Sie, ob Ihr Polys schwarz ist zu machen.

Andere Tipps

Dies ist im Grunde, was ich tue:

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top