Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cargar modelos con animaciones

Iniciado por Findeton, 23 de Enero de 2003, 10:29:36 PM

« anterior - próximo »

Juan Mellado

En la función fillbufferwith estás copiando sólo un vértice al buffer, en vez de todos, prueba a cambiar:



memcpy(pVertices, cvVertices, sizeof(cvVertices) );



por algo así como:



memcpy(pVertices, cvVertices, range*sizeof(VERTCUBO) );



Además, no estás liberando la memoria que reservas para cvVertices. En los dos puntos de salida de la función, añade:



delete [] cvVertices;



Se ve el perfil de una especie de "bestia" azul girando, aunque he tenido que alejar al observador un poco más, estaba muy cerca.

Quedan otros problemas por resolver, ya que de pronto aparece un montón de poligonos de todos los colores.

Venga, un saludo.

Mars Attacks

                                Deja el LSD, Juan... ;)

(Jo, me prometí a mí mismo que me autocensuraría estos posts... pero es que es tan grande la tentación...)                                

Findeton

                                Gracias Juan Mellado. Todabía no he probado el código pero lo haré en cuanto pueda, ya que mi hermano está instalando linux gentoo en el PC dnd programo.

Por cierto, suena mal eso de los polígonos de todos los colores  :llorando: . Tendré que hacer pruebas, aunque todos estáis invitados ;) . Y es raro ya que a todos los vértices les pongo el mismo color....                                

ethernet

Tu codigo tiene un leak o solo a mi me pasa q me gasta solo 400 megas de ram ? xD

Findeton

                                :o  pues si, parece que va comiendo memoria a mogollón :P, tendré que revisar el código de nuevo ya que seguro que es un fallo tonto de nuevo...  :oops:  

PD: ya coseguí ver mi león/diablo ;)                                

Findeton

                                Bien, el fallo era que estaba utilizando el operador new para un doble puntero sin antes utilizar el delete. la corrección es poner en el constructor:

vertices=NULL;  

y al principio de Draw2(), después de:

if (!m_pModel)

 return;


poner:

if(vertices!=NULL)

{

 for (int i = 0; i < nmeshes; i++)

 {

  delete[] vertices[i];

 }

}

if (pntris!=NULL)

 delete[] pntris;
                               

Findeton

                                Buenas, después de un cierto tiempo de inactividad (más exámenes..  :-?  )he podido volver al desarrollo de mi programa. Y de nuevo, os pido ayuda desde mi hulmildad. Después de crear dos post larguísimos y que parece que a nadie han interesado, he hayado el problema, una cosa mucho más reducida y que contaré en otro nuevo post...                                

Findeton

                                                               

Findeton

                                Bien, creo un nuevo post simplemente para que apareza como respondido, como algo 'nuevo'  :X9: .

La cosa es que tengo un buffer de vértices lleno, donde cada 3 vértices forma un triángulo, totalmente diferente y que me es indiferente que esté unido o no a otros vértices. Mientras que cuando renderizo triángulo a triángulo (cada 3 vértices) mediante TRIANGLELIST el modelo se ve perfecto. Sin embargo, cuando renderizo el buffer entero de una sola pasada, con TRIANGLELIST tb, se ven cosas 'extrañas'.

De esta forma rendeo los triángulos uno a uno:

for (int i = 0; i < nmeshes; i++)

{

   if(FAILED(BufferVert->Lock(0, 3*pntris[i]*sizeof(VERTCUBO), (BYTE**)&pVertices, 0 )))

   {

       return 0;

   }





   // copiamos los vértices en los que hemos especificado el modelo

// a la zona de memoria a la que apunta nuestro buffer de vértices.



   memcpy(pVertices, vert3, 3*pntris[i]*sizeof(VERTCUBO) ); //pntris[i] es el nº de polígonos de la malla

   // ¡Nunca olvidar desbloquear el buffer cuando se halla terminado de rellenarlo!

   BufferVert->Unlock();

   for (j = 0; j < 3*pntris[i]; j++)

{

 D3DDisp->DrawPrimitive(D3DPT_TRIANGLELIST, j, 3);

}

   

}


Dando como resultado:


y de esta otra, todos a la vez:

for (int i = 0; i < nmeshes; i++)

{

if(FAILED(BufferVert->Lock(0, 3*pntris[i]*sizeof(VERTCUBO), (BYTE**)&pVertices, 0 )))

   {

       return 0;

   }





   // copiamos los vértices en los que hemos especificado el modelo

// a la zona de memoria a la que apunta nuestro buffer de vértices.

   memcpy(pVertices, vert3, 3*pntris[i]*sizeof(VERTCUBO) ); //pntris[i] es el nº de polígonos de la malla



   // ¡Nunca olvidar desbloquear el buffer cuando se halla terminado de rellenarlo!

   BufferVert->Unlock();

   D3DDisp->DrawPrimitive(D3DPT_D3DPT_TRIANGLELIST, 0, 3*pntris[i]);

}

Dando como resultado:


Realmente, en la imagen donde se ve la trompeta, de vez en cuando se ven fallos, y tb en la imagen donde no se ve la trompeta, de vez en cuando se ve, lo que pasa es que está tapada por tantos triángulos de colores (aunque el buffer lo he rellenado sólo con vértices de un mismo color! La cosa es que cuando rendeo triángulo a triángulo, rellenando cada vez el buffer (esta vez de sólo 1 triángulo, 3 vértices) y representando un triángulo, se ve sin ningún fallo  :!:                                

Mars Attacks

                                Imprímelo en un lienzo y llévalo a algún museo de arte contemporáneo como una pieza valiosísima. Ganarás millones (eso sí, quita lo de Nvidia).                                

BeRSeRKeR

                                El tercer parámetro del método DrawPrimitive es el número de primitivas que se van a procesar (en tu caso una lista de triángulos). En el primer caso que pones, le pasas un valor de 3 (entiendo que te refieres a vértices) cuando el valor correcto sería 1 (1 triángulo). En el segundo caso le pasas (3 * pntris) cuando supongo que debería ser pntris a secas...

Como supongo ya sabrás, mejor utiliza el segundo método

"IDirect3DDevice9::DrawPrimitive should not be called with a single triangle at a time"

:ojo:

Saludos                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Findeton

                                Uhm, grave error el mío. Y sí, ya sé que es mejor renderizar todos los vértices de una sola llamada que de una por triángulo o primitiva, cuando pueda probaré el código, gracias.

PD: De todas formas la segunda imagen me va a hacer famoso, una vez desactive el logo de Nvidia de las propiedades de mi Geforce 4  :P .                                






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.