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
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)
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
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...
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
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
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.
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!!
No. Mira el sdk de DirectX. el ejemplo es así.
Por cierto, no borras el ZBuffer
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!!!)
this->lpD3dDev9=lpD3dDev9;
Esto el compilador lo pruede tratar perfectamente como quie igualas la variable miembro a ella misma.
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 : )
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.
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
Claro... mu bien. Pero es que luego yo comenzaba a llamar métodos, pues no era una simple variable, era un puntero a la interfaz del dispositivo.
Un puntero es una simple variable : )