Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Sólo Con Algunas Tarjetas

Iniciado por Helius, 02 de Agosto de 2003, 11:24:12 AM

« anterior - próximo »

Helius

 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();
   /////////////////////////////////////////////////

}
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

CoLSoN2

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

BeRSeRKeR

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

Zaelsius

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

Mars Attacks

 Pásamelo y te digo dónde casca  (twist)  (twist)  (twist)  

Helius

 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...)
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

Helius

 
Cita de: "Mars Attacks"Pá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é.
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

Zaelsius

 
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

BeRSeRKeR

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

Mars Attacks

 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.

CoLSoN2

 mars tio CÓMPRATE UN PUTO PC, ke desmoralizas a cualkiera.. ha habido algo de lo posteado en este foro ke te funcionara 100%?
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

Mars Attacks

 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?

_Grey

 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

Helius

 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:  
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

Mars Attacks

 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 :()






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.