Pergunta

Sou absolutamente novo no DirectX e gostaria de desenhar alguns primitivos não transformados com a configuração direta mais básica (para fins de aprendizado). Eu já desenhei algumas primitivas com vértices transformados, que são vértices com o conjunto de sinalizadores d3dfvf_xyzrhw.

Agora estou tentando obter a mesma saída com vértices não transformados, mas não recebo nenhum visual na tela. Mudei meu FVF e ajustei os vértices, mas ainda não defini nenhuma matriz de transformação (mundo, visão, projeção). É necessário definir alguma dessas matrizes? Eu suponho que tudo funcionaria como com vértices transformados quando nenhuma matrizes estiver definida, mas obviamente não é esse o caso.

Que área (em coordenadas mundiais) é visível por padrão? O que tenho que fazer para fazê -lo funcionar?

Isso é basicamente o que eu faço:

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

Desde já, obrigado!

EDIT: Agora eu entendi, a iluminação foi habilitada, o erro de iniciante estúpido. Obrigado pela sua ajuda de qualquer maneira!

Foi útil?

Solução

Bem, se você definir seu mundo, ver matrizes de visualização e projeção para a identidade, o que você receberá é um passe simples.

x variará de -1 a 1
y variará de -1 a 1
Z variará de 0 a 1 (este bit pode causar problemas).

Se você definir verts não transformados padrão e passar por dentro nesse intervalo, eles serão exibidos na tela.

Se isso não ajudar a postar algum código e verei o que posso sugerir.

EDIT: Você tem o buffer z ativado? Porque você não limpa o seu Z-Buffer, o que pode causar problemas estranhos. Tudo se tornará por trás disso e, portanto, nunca será renderizado.

Definir

pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );

ou

pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );

Para testar esta hipótese.

Também vale a pena aprender a usar o PIX e depois ver o que acontece com o seu triângulo à medida que passa pela cena.

Edit2:

É possível que seu problema esteja proveniente da iluminação. Tente desligar a iluminação

ou seja

pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

Tente também alterar o seu claro:

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

E verifique se seus polys estão pretos.

Outras dicas

Isso é basicamente o que eu faço:

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top