Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Helius en 02 de Agosto de 2003, 11:24:12 AM

Título: Problema Sólo Con Algunas Tarjetas
Publicado por: Helius en 02 de Agosto de 2003, 11:24:12 AM
 Holas

Vereis tengo un juego de una bolita que va por ahi rebotando en 3D que estoy vendiendo por internet y para renderizarla utilizo DrawIndexedPrimitive. El caso es que he notado que algunos clientes se les "cuelga" el juego cuando pasan por esta función (alguno de vosotros que me lo ha probado también le pasaba esto). Casi todos usaban una tarjeta sin T&L. Alguien sabe donde puede estar el error???  Yo es que con mis 2 ordeneadores no tengo ningun problema (y eso que uno de ellos no tiene T&L) asique no tengo forma de depurarlo... si supiera en que linea salta la excepción... Aquí esta el código de la función:


void CEsfera::Renderizar(void)
{
   /////////////////////////////////////////////////
   Guard(CEsfera::Renderizar());
   /////////////////////////////////////////////////
   m_pDispD3D->SetRenderState( D3DRS_FILLMODE,     D3DFILL_SOLID );
   m_pDispD3D->SetRenderState( D3DRS_CULLMODE,     D3DCULL_CCW);
   m_pDispD3D->SetRenderState( D3DRS_SRCBLEND,     D3DBLEND_SRCALPHA );
   m_pDispD3D->SetRenderState( D3DRS_DESTBLEND,    D3DBLEND_INVSRCALPHA );
   m_pDispD3D->SetRenderState( D3DRS_ZENABLE,     true );
   m_pDispD3D->SetRenderState( D3DRS_STENCILENABLE,   FALSE );
   m_pDispD3D->SetRenderState( D3DRS_CLIPPING,     TRUE );
   m_pDispD3D->SetRenderState( D3DRS_LIGHTING,     true);
   m_pDispD3D->SetRenderState( D3DRS_ALPHABLENDENABLE,   false );
   m_pDispD3D->SetRenderState( D3DRS_CLIPPLANEENABLE,   FALSE );
   m_pDispD3D->SetRenderState( D3DRS_VERTEXBLEND,    FALSE );
   m_pDispD3D->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE );

   m_pDispD3D->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
   m_pDispD3D->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
   m_pDispD3D->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
   m_pDispD3D->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
   m_pDispD3D->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
   m_pDispD3D->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);
   m_pDispD3D->SetTextureStageState( 1, D3DTSS_COLOROP,   D3DTOP_DISABLE );
   m_pDispD3D->SetTextureStageState( 1, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );

   m_pDispD3D->SetTextureStageState( 0, D3DTSS_MINFILTER, m_pManager->GFX_OPC_BILINEAR );
   m_pDispD3D->SetTextureStageState( 0, D3DTSS_MAGFILTER, m_pManager->GFX_OPC_BILINEAR );
   m_pDispD3D->SetTextureStageState( 0, D3DTSS_MIPFILTER, m_pManager->GFX_OPC_MIPMAP );

   m_pDispD3D->SetTextureStageState(0,D3DTSS_ADDRESSU,    D3DTADDRESS_CLAMP);
   m_pDispD3D->SetTextureStageState(0,D3DTSS_ADDRESSV,    D3DTADDRESS_CLAMP);

   m_pDispD3D->SetStreamSource( 0, m_pBufferVertices, sizeof(VERTICE) );
   m_pDispD3D->SetVertexShader( D3DFVF_VERTICE );

   if (m_fRadio<=2.5f)
       m_pDispD3D->SetTexture(0, m_pTexturaNorm);
   else
       m_pDispD3D->SetTexture(0, m_pTexturaGra);

   m_pDispD3D->SetMaterial(&m_matMaterial);

   m_pDispD3D->SetIndices(m_pBufferIndices,0);


   MATRIZ mat, matrot, matescal, mattras;

   MAT_MatrizEscalacion(&matescal, m_fRadio, m_fRadio, m_fRadio);
   MAT_MatrizTraslacion(&mattras, m_vPos.x, m_vPos.y, m_vPos.z);
   MAT_MatrizRotacionY(&matrot, 180);

   mat = matescal * matrot * mattras;

   m_pDispD3D->SetTransform(D3DTS_WORLD, &mat);

   m_pDispD3D->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP, 0, m_dwNumDeVertices, 0, m_dwNumDePolis);

   /////////////////////////////////////////////////
   Unguard();
   /////////////////////////////////////////////////

}
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: CoLSoN2 en 02 de Agosto de 2003, 12:09:54 PM
 a mi me pasaba eso con un proyecto que hice para el instituto. el DrawIndexedPrimitive iba bien en mi casa pero allí (TNT2's) no, así que después de mucho darle vueltas tuve que usar DrawPrimitive sin más..
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: BeRSeRKeR en 02 de Agosto de 2003, 12:34:42 PM
 ¿Has probado a poner Direct3D en modo debug con la salida de información al máximo y viendo la salida en la ventana output del compilador?. A tí te funciona bien pero tal vez te dé algún warning que podría ser el causante del fallo en otras tarjetas.

Otra cosa. ¿El error sólo te lo da al pintar la esfera?. ¿Has probado a desactivar el render de la esfera y has mirado si el resto se pinta bien?. Evidentemente es complicado porque si no puedes reproducir el error en tu máquina...

Saludos

PD: otra cosa, supongo que utilizas índices de 16 bits. De todas formas creo recordar que el fallo por utilizar índices de 32 bits en tarjetas que no los soportan era que la geometría no se pintaba bien, no que se colgase la aplicación...
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: Zaelsius en 02 de Agosto de 2003, 12:43:58 PM
 No sé si tendrá algo que ver, pero tal vez habría que comprobar en las Caps de la tarjeta cual es el nº máximo de triangulos por buffer. Creo que la mayoria te dejan unos 65536 o asi.

Pero tambien dudo que tu esfera tenga mas de 1000 polis, asi que no se...  :(

Edit:
Sin duda lo mejor seria conseguir una de las tarjetas problematicas y trabajar con ella. Si estás ganando dinero con el juego, pues no creo que 30€ por una TNT 1/2 sea demasiado dinero ...  ;)  
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: Mars Attacks en 02 de Agosto de 2003, 01:40:16 PM
 Pásamelo y te digo dónde casca  (twist)  (twist)  (twist)  
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: Helius en 02 de Agosto de 2003, 06:24:14 PM
 Gracias a todos.

Se que casca exactamente en esa función, pero sin poder reproducir el error en mi makina no se en que linea. Todo indica a DrawIndexedPrimitive porque el resto de cosas las utilizan otras partes del juego sin problemas (y la esfera es lo unico que pinto con index buffers).

Los indices estan a 16 bits y la esfera no llega a 200 poligonos... El error se trata de una excepcion no controlada (como si accedieras a un puntero nulo) que hace saltar mi manejador de excepciones, lo unico que puedo sacar de ahi es la pila de llamadas y se queda justamente en esa que he posteado.

¿Es posible que DrawIndexedPrimitive no este disponible en estas tarjetas? (que por cierto suelen ser atis tnt, tnt2, rage 128, SiS300/305/630/540/730, S3 ProSavage... algo antiguas vaya!)

BeRSeRKeR, si lo depuro con la version debug de direct3d me dice que:
Direct3D8: (ERROR) :*** Exception in d:\builds\nt32_chk\multimedia\directx\dxg\d3d8\fe\vshader.cpp Line: 666
Direct3D8: (ERROR) :Stream 0 stride should match the stride, implied by the current vertex shader

en otra parte totalmente distinta del juego (que tampoco le veo mucha lógica...)
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: Helius en 02 de Agosto de 2003, 06:29:40 PM
 
Cita de: Mars AttacksPásamelo y te digo dónde casca  (twist)  (twist)  (twist)
Mars, puedes bajarte la demo de mi peich (http://helium.planetiso.com)
El log lo encontrarás en el directorio donde instales el juego despues de haberlo ejecutado.
Vosotros mismos podreis ver en el log la pila, que se queda en esa función que posteé.
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: Zaelsius en 02 de Agosto de 2003, 07:20:23 PM
 
Cita de: Helius�Es posible que DrawIndexedPrimitive no este disponible en estas tarjetas? (que por cierto suelen ser atis tnt, tnt2, rage 128, SiS300/305/630/540/730, S3 ProSavage... algo antiguas vaya!)
Ahora que pienso, los propietarios de esas tarjetas tan "antiguas" no suelen ser  aficionados a la actualización periódica de drivers. ¿Podría ser un problema de drivers anteriores a DX8?

Esas tarjetas (al menos la archiconocida y aun usada ampliamente TNT2) creo que sí deben soportar DrawIndexedPrimitives(). Puede que sea el driver el que no sabe que hacer con los índices :-?

Nota: Con las S3 desde luego que no va a funcionar nada nuevo, porque están prácticamente sin soporte.

Edit: He probado la demo, y tal vez los requisitos recomendados sean algo altos (PIII 1Ghz)...pon menos en la web, aunque sea mentira XD
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: BeRSeRKeR en 02 de Agosto de 2003, 07:50:09 PM
 La TNT2 sí soporta primitivas indexadas. Que yo sepa no hay ningún problema con esto. Por lo menos la documentación no contempla esa posibilidad...

Saludos
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: Mars Attacks en 02 de Agosto de 2003, 08:24:19 PM
 Para empezar, no veo nada, está todo negro. Al clicar con el ratón he oído algunos ruiditos, y al poco me ha aparecido el siguiente mensaje:

There was an error. Please, contact "support@planetiso.com" for support

El log casi mejor te lo envío por privado que abulta mucho. De hecho ya había probado tu motor y te envié un privado porque no me iba, si no recuerdo mal. Ahora tengo otros drivers supuestamente más actuales y ha pasado lo que te he dicho.
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: CoLSoN2 en 02 de Agosto de 2003, 08:47:21 PM
 mars tio CÓMPRATE UN PUTO PC, ke desmoralizas a cualkiera.. ha habido algo de lo posteado en este foro ke te funcionara 100%?
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: Mars Attacks en 02 de Agosto de 2003, 09:21:40 PM
 El motor de AgeR me funciona al 100% :D
Bueno, desde los nuevos drivers siempre y cuando la profundidad que le ponga no sea a 32 bits.
También me funciona medianamente bien el Blast de DrakkaR, y me funciona a la perfección el WodoX de Ionicboy.
Y lo de fiero, aunque muy lentito, también me va.
Y por supuesto cualquier cosa que haga yo, porque si no me funcionara no podría hacerla. Pero claro, lo que hago yo es tan sencillo que funciona hasta en mi P-150 con opengl (nada de directx).

Lalala, ¿está claro?
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: _Grey en 02 de Agosto de 2003, 11:17:02 PM
 A mi el programa me va perdecto.... menos...... que despues de jugar y regresar al sistema todo esta inestable, el reproductor multimedia, el explorer..... en fin. Tines cuidado al releasear los vertexbuffer y indexbuffer y las texturas, es decir si tienes una textura activa en el settexturestage no se liberara..... y asi con los vertex buffers y demas.

La gente que dice que les peta el programa se lo hace desde el primer momento? o al rato??? tienes en cuenta que es un strip cuando pones la cantidad de polis ?????

En fin, suerte
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: Helius en 03 de Agosto de 2003, 12:23:19 PM
 Mmm el tema de los drivers puede ser una opción... de hecho creo que un cliente resolvió el problema parcheando los drivers. Extraño bug el mio... <_<

_Grey, eso que me dices es rarísimo, programos sobre un framework que me hice hace tiempo que si principal misión es eliminarlo todo por medio de smart pointers y demas, y en cuanto a las interfaces de directx ni una permanece viva, incluso si hay excepciones todo se borra.
A la gente le peta cuando el codigo pasa por esa función que puse, que es justamente cuando se selecciona un nivel y te pones a jugarl. Todo indica a DrawIndexedPrimitive.

Mars tio, colson tiene razón  :D , gracias por enviarme el log y es normal que no te funcione bien, ademas te crea el dispositivo en modo software  (ole).

Zaelsius, si miento en los requisitos de la web tendría problemas, hay gente tan extraña que compra el juego sin probar la demo, asique si no les funciona me van a pedir el dinero, por ello necesito ponerlo tal y como es para que si se quejan poder echarselo en cara  :rolleyes:  
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: Mars Attacks en 03 de Agosto de 2003, 01:11:10 PM
 Ya sé que Colson tiene razón, pero como no me pague Colson el puto pc, me temo que voy a seguir siendo el banco de pruebas más duro (y de paso, a no poder disfrutar de vuestras virguerías :()
Título: Problema Sólo Con Algunas Tarjetas
Publicado por: ProD en 04 de Agosto de 2003, 10:05:39 AM
 Bueno... no se si estarás usando Directx9.0, si es así, si no estás utilizando un vertex shader
debes indicar el típo de vértice con setFVF no con setVerteShader, creo que esto es por lo que te puede estar dando el warning ese... venga espero haber ayudado. Un saludo.