Pregunta

Estoy absolutamente nueva para DirectX y me gustaría sacar algunas primitivas no transformadas con la configuración más básica Direct3D (con fines de aprendizaje). Ya atrajo a unos primitivos con vértices transformadas, es decir los vértices con el flag D3DFVF_XYZRHW.

Ahora estoy tratando de conseguir el mismo resultado con vértices no transformadas, pero no obtener ningún elemento visual en la pantalla. He cambiado de FVF y ajusté los vértices, pero no fijó ninguna matriz de transformación (mundo, visión, proyección) todavía. ¿Es necesario establecer ninguna de esas matrices? Me asumir que todo iba a trabajar al igual que con vértices transformados cuando no se han fijado las matrices, pero obviamente ese no es el caso.

¿En qué área (en coordenadas mundiales) es visible por defecto? ¿Qué tengo que hacer con el fin de hacer que funcione?

Esto es básicamente lo que hago:

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

Gracias de antemano!

EDIT: Ahora lo tengo, iluminación fue activada, error de principiante estúpida. Gracias por su ayuda de todos modos!

¿Fue útil?

Solución

Bueno, si configura su mundo, ver y proyección matrices de identidad a continuación, lo que se obtiene es un simple pase a través.

x oscilará de -1 a 1
y estará en el intervalo de -1 a 1
z estará en el intervalo de 0 a 1 (Este bit puede causar problemas).

Si se definen los vértices no transformadas estándar y los pasa dentro de ese rango que se mostrarán en la pantalla.

Si eso no ayuda a enviar algo de código y veré lo que puedo sugerir.

Edit: ¿Usted se ha habilitado Z-Buffering? Debido a que no se borre de su memoria tampón Z que podría causar problemas impares. Todo va a hacer que detrás de esto y por lo tanto nunca se rendirá.

Set

pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );

o

pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );

Para probar esta hipótesis.

También es muy mucho la pena aprender a usar PIX y luego ver lo que sucede a su triángulo, ya que pasa a través de la escena.

Edit2:

Su posible que su problema proviene de la iluminación. Prueba a activar la iluminación fuera

es decir,

pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

También tratar de cambiar su clara a esta:

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

y comprobar para ver si sus polígonos están prestando negro.

Otros consejos

Esto es básicamente lo que hago:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top