Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: SkyNetBCN en 23 de Enero de 2007, 10:42:03 PM

Título: Hago mal el DrawPrimitive?
Publicado por: SkyNetBCN en 23 de Enero de 2007, 10:42:03 PM
Hola compañeros, estoy intentando dibujar "a mano" un objeto (mesh) en vez de pasárselo entero al DirectX, pero me dibuja una auténtica guarrada...



lo que intento es:

Mesh->GetVertexBuffer( &Vertices ):
Num = Mesh->GetNumVertices();
Vertices->Lock( 0, 0, (void**)&pVertices, 0  );
Vertices->Unlock();
Vertices->Release();
//
//..
//..
//
3D->SetStreamSource( 0, VerticesParedes, 0, sizeof(D3DVERTEX) );
3D->SetFVF( D3DVERTEX::FVF );
3D->DrawPrimitive(D3DPT_TRIANGLELIST ,0,Num/3);

El fin de todo esto es (una vez consiga como mínimo dibujar correcamente algo  :P ) optimizar el renderizado, ya que dibujo un mapa muy grande y el directX me dibuja toooodo... y evidentemente los fps caen en picado....

gracias de antemano!
Título: Hago mal el DrawPrimitive?
Publicado por: BeRSeRKeR en 24 de Enero de 2007, 01:09:36 AM
Hola.

Ese código que has puesto no parece tener ningún sentido.

Primero recoges un vertex buffer (Vertices) al que haces un Lock/Unlock pero entre medias no haces nada (se supone que el buffer se rellenaría con los datos de los vértices). Y además, justo después haces un Release (eliminas el vertex buffer).

Y luego renderizas utilizando un vertex buffer (VerticesParedes) que no se sabe muy bien de dónde sale. Tal vez sea el del fragmento de código previo, pero es que ese se supone que no lo has rellenado y además lo has eliminado, ¿no?.

Saludos.
Título: lol
Publicado por: SkyNetBCN en 28 de Enero de 2007, 08:51:34 PM
joer que pajarillo estoy... todo son errores al copiar...

resumiendo, tengo un Mesh cargado, y lo que quiero es obtener la informaíón de sus vértices para dibujar con la función DrawPrimitive. Y un resumen de lo que hago es:

struct D3DVERTEX
{
   D3DXVECTOR3 p;
   D3DXVECTOR3 n;
   FLOAT       tu, tv;

   static const DWORD FVF;
};

const DWORD D3DVERTEX::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;

//
//
//

LPDIRECT3DVERTEXBUFFER9 Vertices;
DWORD dwNumVertices;

Mesh->GetVertexBuffer( &Vertices );
dwNumVertices = Mesh->GetNumVertices();


//
//
//


         
DXUTGetD3DDevice()->SetRenderState(D3DRS_LIGHTING, FALSE );
DXUTGetD3DDevice()->SetFVF( D3DVERTEX::FVF );
DXUTGetD3DDevice()->SetStreamSource( 0, Vertices, 0, sizeof(D3DVERTEX) );
DXUTGetD3DDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, dwNumVertices );



El caso es que me dibuja algo; un puñado de triángulos dibujado por "ahí" al tuntún y sin ningún orden... si alguien me pudiese ayudar... gracias!!
Título: Hago mal el DrawPrimitive?
Publicado por: BeRSeRKeR en 28 de Enero de 2007, 09:58:12 PM
Asegúrate de tener bien puestas las matrices de transformación (world, view y projection).

También asegúrate de que los vértices que estás pasando a DrawPrimitive están ordenados de tal forma que formen triangle strips (o cualquier primitiva que quieras).

Saludos.
Título: Hago mal el DrawPrimitive?
Publicado por: marcode en 29 de Enero de 2007, 04:26:14 PM
Como no sea que está indexado..., desde luego no creo que sea un STRIP.

Pusiste los Begin/EndScene ?

Prueba con un mesh simple como un cubo.
Título: Hago mal el DrawPrimitive?
Publicado por: SkyNetBCN en 29 de Enero de 2007, 09:38:13 PM
Perdonar mi ignorancia pero... como puedo saber si los vértices están ordenados? y si no lo están, como los puedo ordenar?

Sí, sí he puesto el Begin/EndScene... la verdad es que el mesh ya es simple, es "suelo" , un rectángulo enorme sin desniveles de momento...
Título: Hago mal el DrawPrimitive?
Publicado por: BeRSeRKeR en 29 de Enero de 2007, 10:55:34 PM
En la documentación del SDK mírate el apartado titulado Primitives. También puedes echarle un vistazo al apartado Rendering from Vertex and Index Buffers.

Saludos.