Jump to content

Mis Rutinas Graficas


DarIOI

Publicaciones recomendadas

En tu rutina de redibujado despues del D3DDEV8.EndScene deves poner algo como:

 

IF D3DDEV8.Present( NIL, NIL, 0, NIL)<>0 THEN recreateViewports;

 

haz esta prueba con el project1.exe que subistes: ejecuta el programa y mientras esta funcionando ve a las propiedades del desktop en windows y en configuracion cambia la calidad de color de 32bit a 16 bit o cambia la resolucion de la pantalla; despues de hacer eso regresa a ver tu programa y notaras que ya no se ve el poligono con la textura, si no que solo se ve el Tpanel o la forma de la ventana principal. Si logras hacer que tu renderizado sobreviva a un cambio de configuracion de pantalla entonces su programa ya maneja la perdida del device.

 

Que en algunas computadoras tu programa solo se vea un instante y despues se desaparesca podria deverse a que el viewport se arruina una vez al arrancar el programa y ya no se vuelve a restaurar.

 

buena suerte

 

natalie,

el metodo Present, lo utilizo por supuesto, pero yo no contemplaba ese detalle de que se pierde el viewport. Hice el algoritmo de la siguiente forma:

 

Si "device->present" <> 0 entonces

D3DXMatrixPerspectiveFovLH(.....);

 

Luego intenté cambiar la configuración de pantalla/colores; en efecto, el viewport se perdió, pero no lo puede recuperar más aun con la modificación que le hice. Es más, intenté hacer un seguimiento en tiempo de ejecución y una vez que se pierde el viewport el programa entra por la sentencia del D3DXMatrix..... y después vuelve a entrar de vuelta y asi sucesivamente, dicho de otro modo, el metodo present me da <>0 permanentemente. ¿que se estará haciendo mal?

 

1) todo está hecho dentro del evento ONPAINT

2) Con o sin timer, no surte efecto.

 

Yo también supongo que en ciertas compus, el viewport se pierde, pero el asunto es que no hallo la forma de recuperarlo.

Espero news!

Enlace al comentario
Compartir en otros sitios web

Ah perdón... el segundo test que subiste, a mi también me funciona bien, si lo ejecuto directamente,

yo me refería a que desaparece el recuadro gris cuando ejecuto el primer programa que subiste.

Pensé que el primero tomaba al segundo. Sorry...

Enlace al comentario
Compartir en otros sitios web

Animo Dario, tengo el mismo error que Max y Erogan, la resolución de mi pantlla es;

1152x864 16 bits

 

El ejecuable que pusistes test1, mi antivirus me lo detecta como un troyano, he desactivado mi antivirus para ejecutarlo pero a veces sale el error como a Max y Erogan y otras ocasiones me deja abrir un tr4 con la lista de los objetos en la ventana de la derecha pero la ventana principal en negro, como a Ivan2.

 

Por cierto tambien me sale la ventana descentrada y tengo que moverla al centro de la pantalla.

 

Suerte

Enlace al comentario
Compartir en otros sitios web

Y yo 1440 X 900 y calidad de color de 32 Bits

Ahora, se solucionaron todos los errores que aparecian antes. Pero me encuentro en una situacion parecida a la de Pemon, el ejecutable ya no tira errores y puedo abrir un nivel .tr4 pero la ventana principal queda en negro.

1.JPG

Enlace al comentario
Compartir en otros sitios web

Si "device->present" <> 0 entonces

D3DXMatrixPerspectiveFovLH(.....);

 

Mi amigo dario, disculpame, devi especificar mejor; el D3DXMatrixPerspectiveFovLH es apenas de las ultimas instrucciones que van incluidas en todo el proceso de la re-creacion de lo que yo llamo viewport; pero en realidad por "viewport" me refiero todo el device; es decir tienes que liberar el device anterior (D3DDEV8 = nil) y volver a crearlo desde el principio; todo todo, desde pedir las caracteristicas de la tarjeta, crear el D3DDEV8 y volver a definir la perspectiva del viewport. Tambien deves de verificar como creastes las texturas; si las creastes con la caracteristica de que unicamente estan en la memoria de video entonces deves de cargarlas desde el disco otra vez.

 

suerte

Enlace al comentario
Compartir en otros sitios web

@max: entonces, que has hecho para que te dejara de tirar esos carteles de error?

 

Mi amigo dario, disculpame, devi especificar mejor; el D3DXMatrixPerspectiveFovLH es apenas de las ultimas instrucciones que van incluidas en todo el proceso de la re-creacion de lo que yo llamo viewport; pero en realidad por "viewport" me refiero todo el device; es decir tienes que liberar el device anterior (D3DDEV8 = nil) y volver a crearlo desde el principio; todo todo, desde pedir las caracteristicas de la tarjeta, crear el D3DDEV8 y volver a definir la perspectiva del viewport. Tambien deves de verificar como creastes las texturas; si las creastes con la caracteristica de que unicamente estan en la memoria de video entonces deves de cargarlas desde el disco otra vez.

 

suerte

 

Entonces debo llamar nuevamente a que se cree el device, por lo menos eso es lo que haces vos. Ahora bien, estuve leyendo sobre directx y me dice que existe un Metodo Reset( arg ) que se usa en caso de un estado "device lost" , donde "arg" es la nueva estructura que guarda la info referida a la tarjeta de video, modo,etc.

Cual sería la diferencia entre crear el device nuevamente y utiilizar el metodo Reset. En ambos casos, hay que llamar a las funciones "GetAdapterMode",etc,etc

 

pd: nos vemos algunos de estos dias. :)

Enlace al comentario
Compartir en otros sitios web

Bueno he seguido haciendo algunas cosas, y creo haber avanzado :abrazos:

 

-El problema de los archivos que se piden está solucionado. He creado un ejecutable 100% standalone.

 

-La pantalla negra sin visualizar los meshes está solucionado. (algo se tiene que ver)

 

-hubieron algunos que reportaron carteles de error a la hora de seleccionar un mesh. Pareciera ser que en esos equipos, o en esas configuraciones de pantalla, el programa no puede visualizar las texturas de 32 bits, es por ello que el programa ahora puede elegir

renderizas los meshes con texturas de 32 o de 16 bits, según sea el caso. (un mensaje de dialogo lo dice).

 

recuerden de poner los archivos zlib1.dll y el d3dx81ab.dll en la misma carpeta.

 

suerte!

PROTOTIPO.rar

Enlace al comentario
Compartir en otros sitios web

Voy a probarlo :abrazos:

 

DLLs que pide:

 

- ZLIB1.DLL >>>>> descarga

- D3DX81AB.DLL >>>>> descarga

 

 

Vale, los TR4 que he probado funcionan sin problemas y no me ha salido ningun mensaje de error. Lo unico que no me gusta es que la pantalla no salga centrada al arrancar el programa, que el fondo rosa ese hace un poco daño a la vista y que las animaciones van demasiado rapidas.

Enlace al comentario
Compartir en otros sitios web

Ok, ahora este programa ya esta muchisimo mejor, ya tiene lo mas importante funcionando; ahora se ven los mesh rotando en 0,0,0; no recibí ningun mensaje de error. y la velocidad de rotacion la encuentro perfecta en mi computadora; si tenes eso amarrado con un timer no creo que exista problema, pero si lo que haces es que incrementas un grado de rotacion en el loop del programa entonces en las mejores computadoras rotará mas rapido que un trompo.

 

Unas cositas que todavia se tienen que revisar.

 

- Cuando el mesh esta rotando se puede apreciar algo raro en la renderizada; es como si tambien se redibujara por dentro del mesh y aveces pareciera que ciertas caras son como transparentes. No estoy clara exactamente a que se deve en tu caso pero los motivos que comunmente generan este tipo de problema son:

 

- El Z buffer no esta activado, (z depth) se deve de activar para que los polygonos que estan parcial o totalmente cubiertos por otros polygonos cuando se ven desde la vista de la camara no se dibujen o se dibujen solo parcialmente.

- Tienes que activar el CULL, es decir los polygonos no se deven de dibujar cuando estan siendo vistos por "detras"; Ojo, que los poligonos en tomb raider se definen en el sentido de las manecillas del reloj.

 

- Y ya que andas en los stages tambien activa el perspective correct (D3DTSS_MAGFILTER y D3DTSS_MINFILTER), ya que cuando los meshs estan bien cerca de la camara se ve muy pixeleado.

 

- Sobre el device lost, recrear todo el device es lo que hago yo, pero sin con el RESET te funciona entonces te ahorrastes escribir lineas de codigo; lo importante es que agregues soporte para eso; no penses que eso pasa raramente, el device no se pierde solo al cambiar la resolucion o la profundidad de color (nadie se pone a hacer a cada rato) pero si hay otras circustancias mucho mas comunes que te pueden aruinar el device, por ejemplo que tan comun crees que sera que alguien ejecute tu programa y despues lo minimize un momento y ejecute otro programa que usa directx como fexmerger, dxtre3d, wadmerger, el editor oficial, o quiera correr el tomb raider para probar lo que acaba de modificar con tu herramienta... etc, todos esos programas crearon un device, pusieron sus texturas en la memoria de video, hicieron vertex buffers, etc, todos esos programas estan compartiendo la tarjeta de video y pudieron arruinar lo que hizo en su momento el otro; y eso no importa siempre y cuando cada programa una vez que el usuario lo vuelve otra vez a maximizar puede volver a poner el estado a como lo tenia antes de minimizarlo.

 

buena suerte con tu projecto.

Enlace al comentario
Compartir en otros sitios web

Ok, ahora este programa ya esta muchisimo mejor, ya tiene lo mas importante funcionando; ahora se ven los mesh rotando en 0,0,0; no recibí ningun mensaje de error. y la velocidad de rotacion la encuentro perfecta en mi computadora; si tenes eso amarrado con un timer no creo que exista problema, pero si lo que haces es que incrementas un grado de rotacion en el loop del programa entonces en las mejores computadoras rotará mas rapido que un trompo.

 

Unas cositas que todavia se tienen que revisar.

 

- Cuando el mesh esta rotando se puede apreciar algo raro en la renderizada; es como si tambien se redibujara por dentro del mesh y aveces pareciera que ciertas caras son como transparentes. No estoy clara exactamente a que se deve en tu caso pero los motivos que comunmente generan este tipo de problema son:

 

- El Z buffer no esta activado, (z depth) se deve de activar para que los polygonos que estan parcial o totalmente cubiertos por otros polygonos cuando se ven desde la vista de la camara no se dibujen o se dibujen solo parcialmente.

- Tienes que activar el CULL, es decir los polygonos no se deven de dibujar cuando estan siendo vistos por "detras"; Ojo, que los poligonos en tomb raider se definen en el sentido de las manecillas del reloj.

 

- Y ya que andas en los stages tambien activa el perspective correct (D3DTSS_MAGFILTER y D3DTSS_MINFILTER), ya que cuando los meshs estan bien cerca de la camara se ve muy pixeleado.

 

- Sobre el device lost, recrear todo el device es lo que hago yo, pero sin con el RESET te funciona entonces te ahorrastes escribir lineas de codigo; lo importante es que agregues soporte para eso; no penses que eso pasa raramente, el device no se pierde solo al cambiar la resolucion o la profundidad de color (nadie se pone a hacer a cada rato) pero si hay otras circustancias mucho mas comunes que te pueden aruinar el device, por ejemplo que tan comun crees que sera que alguien ejecute tu programa y despues lo minimize un momento y ejecute otro programa que usa directx como fexmerger, dxtre3d, wadmerger, el editor oficial, o quiera correr el tomb raider para probar lo que acaba de modificar con tu herramienta... etc, todos esos programas crearon un device, pusieron sus texturas en la memoria de video, hicieron vertex buffers, etc, todos esos programas estan compartiendo la tarjeta de video y pudieron arruinar lo que hizo en su momento el otro; y eso no importa siempre y cuando cada programa una vez que el usuario lo vuelve otra vez a maximizar puede volver a poner el estado a como lo tenia antes de minimizarlo.

 

buena suerte con tu projecto.

 

bien!

 

*con respecto a la rotación: Ya no uso mas el objeto Timer, me decidí por implementar el evento de sistema OnIdle.

 

*las texturas: ya activé el Zbuffer con obj_device->SetRenderState(D3DRS_ZENABLE, TRUE );

ya he seteado algunas configuraciones para las texturas:

 

obj_device->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);

obj_device->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);

obj_device->SetTextureStageState(0, D3DTSS_ALPHAOP,D3DTOP_DISABLE);

obj_device->SetTextureStageState(0,D3DTSS_MAGFILTER, D3DTEXF_POINT);

obj_device->SetTextureStageState(0,D3DTSS_MINFILTER, D3DTEXF_POINT);

 

en el efecto culling, solo he puesto que se dibuje el poligono cuando éste mira al frente de la cámara, tal como vos decís.

 

Pero siguen habiendo algunos poligonos que se renderizan mal. Si fuera problema del zbuffer, debería notarse un desarreglo mayor en todo el mesh, pero son solo algunas partes en donde no se ve muy bien....

 

*Con respecto al "device lost". Si nuevamente tengo que crear el device, entonces debo practicamente crear los vertexbuffer y los objetos texturas¿?. Es como si tuviera que cargar un nuevo nivel?? :eins:

 

saludos!

Enlace al comentario
Compartir en otros sitios web

Crear una cuenta o conéctate para comentar

Tienes que ser miembro para dejar un comentario

Crear una cuenta

Regístrese para obtener una cuenta nueva en nuestra comunidad. ¡Es fácil!

Registrar una nueva cuenta

Conectar

¿Ya tienes una cuenta? Conéctate aquí.

Conectar ahora
×
×
  • Crear nuevo...