Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Hago mal el DrawPrimitive?

Iniciado por SkyNetBCN, 23 de Enero de 2007, 10:42:03 PM

« anterior - próximo »

SkyNetBCN

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!

BeRSeRKeR

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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

SkyNetBCN

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!!

BeRSeRKeR

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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

marcode

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.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

SkyNetBCN

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...

BeRSeRKeR

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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.