Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Comienzo Frustrado

Iniciado por pacomix, 08 de Octubre de 2003, 12:56:26 AM

« anterior - próximo »

pacomix

 Después de darle 10000 vueltas y comprobar 20000 veces el código me veo incapaz de poder renderizar un simple triángulo con un buffer de vértices en DirectX. El caso es que está todo copiado tal como aparece en la SdK 9 de Dx, la única diferencia es que lo hago con clases. He comprobado las llamadas a los métodos de creación del buffer y a los métodos de DramPrimitive y funcionan todos, los vértices se copian bien al buffer, etc... pero el jodido triangulito no aparece en la pantalla. Alguna sugerencia? ¿Las cosas cambian cuando se hacen con clases? (yo le paso un LPDIRECT3DDEVICE9 a cada función de la clase como parámetro) (en la SdK solo aparece sin clases) Por favor!!! un poquito de ayuda
=El verdadero guerrero de la luz se levanta cuando todos los demás han caído=-

CoLSoN2

 los tutoriales de andypike.com sobre DirectX están muy bien.

así en frío se me ocurren un par de cosas:
- has mirado que la cámara esté correctamente puesta? apuntando al triángulo y tal
- desactiva el backface culling para asegurarte, y sino ten en cuenta que importa el orden en que tienes los vertices (clockwise o anticlockwise)
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

pacomix


El ejemplo que estoy haciendo es el mismo que en la ayuda del SDK Dx9.
He puesto todo tal y como lo ponen a excepción que lo hago con clases. El backface culling está desactivado y la camara no es necesaria puesto que uso las coordenadas de vértices ya transformadas. No tiene ninguna lógica.

Tengo una clase menú, la cual en su método render llama a los demás métodos render de los objetos que formen parte del menu. En esos objetos tengo un LPDIRECT3DDEVICE9, y el LPDIRECT3DVERTEXBUFFER9. El LPDIRECT3DDEVICE9 lo igualo al de menu en el momento de la creación del objeto y relleno tb el buffer de vértices. El caso es que todo está bien y debería funcionar... todas las llamadas a los métodos de la interfaz dx9 se realizan sin ningún problema... ya no se que hacer... me pasaré a OpenGL
=El verdadero guerrero de la luz se levanta cuando todos los demás han caído=-

Haddd

 Pon el código en algún lado para que podamos ayudarte. De todas formas, eso de que pases las coordenadas ya transformadas para un principiante, como dices que eres, me mosquea un poco...

AlexHdez

 Hablo asi a la babala, pero a mi me paso con 2d que intentaba pasar los surfaces de las imagenes por algunas funciones de mis clases y compilaba bien pero no pasaba nada. La cuestion era que necesitaba pasarlas como punteros o al reves, las pasaba siendolo cuando no debian serlo. A lo mejor te ayuda eso en algo... nu se....

Un saludo

Zaelsius

 Si quieres ayuda real sube el código a alguna parte.. si no tienes espacio web enviamelo y yo lo subo en algun sitio para que lo pueda ver el resto.  :P

E-mail: zsgames(at)hotmail.com

pacomix

 void Panel::InitGeometry()
{
   tagVerticeRhwTex mVertices[] =
   {
       { 150.0f,  50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
       { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
       {  50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
   };

   //We create the vertex buffer to place the vertex
   if(FAILED(lpD3dDev9->CreateVertexBuffer(3*sizeof(tagVerticeRhwTex), 0, D3DFVF_PANEL, D3DPOOL_DEFAULT, &lpVb, NULL)))
   {
      MessageBox(NULL, "No se pudo crear el buffer de vértices", "JODER!!!", MB_OK | MB_ICONASTERISK);
   }
   else
   {
      void* lpVbAux;
      lpVb->Lock(0, 3*sizeof(tagVerticeRhwTex), (void**)&lpVbAux, 0);
         memcpy(lpVbAux, mVertices, sizeof(mVertices));
      lpVb->Unlock();
   }

   return;
}

eso es cuando se crea el objeto panel (lo llamo desde elconstructor)
la clase panel hereda de otra en la que tengo los vertexbuffer así como el dxdev9 el cual se lo paso como parámetro al crear el objeto

y luego lo renderizo de esta forma

void Panel::ShowPanel()
{
   lpD3dDev9->BeginScene();
   lpD3dDev9->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,255,255), 1.0f, 0L );
   if(FAILED(lpD3dDev9->SetStreamSource(0, lpVb, 0, sizeof(tagVerticeRhwTex))))
      MessageBox(NULL, "No se pudo crear el buffer de vértices", "JODER!!!", MB_OK | MB_ICONASTERISK);
   //lpD3dDev9->SetTexture(0, lpD3dTex);
   else
   {
      lpD3dDev9->SetFVF(D3DFVF_PANEL);     //D3DFVF_XYZRHW | D3DFVF_DIFFUSE
      lpD3dDev9->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
   }
   lpD3dDev9->EndScene();
   lpD3dDev9->Present(NULL, NULL, NULL, NULL);
}

No entiendo pq no funciona. Antes de hacer unos cuantos cambios, incluso le aplicaba textura, pero ahora no se donde demonios puede estar el fallo...
Gracias por todo vuestro interés.
=El verdadero guerrero de la luz se levanta cuando todos los demás han caído=-

Haddd

 Bueno, creo que en modo XYZW los valores van de -1 a 1. Tu ya pones los valores de la coordenada x,y de pantalla y eso creo que no es así. En realidad te lo pinta, pero fuera de la pantalla!!

pacomix

 No. Mira el sdk de DirectX. el ejemplo es así.
=El verdadero guerrero de la luz se levanta cuando todos los demás han caído=-

Haddd

 Por cierto, no borras el ZBuffer

pacomix

 Conseguí solucionar ese problema, aunque no le encuentro la mas mínima lógica.

En el constructor de la clase Panel yo le pasaba un LPDIRECT3DDEVICE9 como parámetro con el nombre lpD3dDev9.
La clase tenía otro LPDIRECT3DDEVICE9 que la heredaba de su superclase.
En el constructor yo hacía lo siguiente:

this->lpD3dDev9=lpD3dDev9;

lo cuál según c++ es válido y me asigna el valor que le pasé como parámetro al miembro de la clase lpD3dDev9 que hago referencia a través del puntero 'this'

Pues bien, cambié el nombre de la variable que le pasaba como parámetro al constructor y todo fué de perlas.
Lo raro de todo es que no de daba ningún fallo, ni de compilación ni en tiempo de ejecución. ¿Alguien sabe algo más sobre todo esto?
Gracias a todos los que me habéis ayudado. Un saludo a todos y en especial a http://www.m2play.com (Marcus espero tener noticias tuyas pronto!!!)
=El verdadero guerrero de la luz se levanta cuando todos los demás han caído=-

Haddd

 this->lpD3dDev9=lpD3dDev9;

Esto el compilador lo pruede tratar perfectamente como quie igualas la variable miembro a ella misma.

MChiz

 Pondria la mano en el fuego que es lo que dice Haddd, sin duda alguna. El puntero 'this' no se usa para ese tipo de cosas : )

pacomix

 Contestando a Hadd, de todas formas, ¿como explicas luego que no me de error en tiempo de ejecución? ¡es que eso es lo raro! Que no me decía nada de nada.
=El verdadero guerrero de la luz se levanta cuando todos los demás han caído=-

MChiz

 No te ha de dar ningun error en tiempo de ejecucion. Es como si hicieses:

int i = 0;

i = i;

Que luego en modo release se cepille la sentencia, no te digo que no :b






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.