Jump to content

Mis Rutinas Graficas


DarIOI

Publicaciones recomendadas

jeje. Gracias camaradas, favor que me hacen.

Es algo medio dificil encarar un proyecto como éste. Estoy intentando adaptarme a una version de directx, con un determinado lenguaje y con un paradigma de programación. Ya mucho de esto lo he logrado hace algo de tiempo, pero siempre hay que desarmar, redefinir código o reescribir de vuelta..... porque si no es una cosa es la otra, etc. Hay que armarse de paciencia. Igualmente, es muy divertido programar, me gusta tanto como diseñar niveles. :(

 

En este nuevo prototipo he incluido: rutinas para el rotado, zoom, y traslado del mesh con el mouse.

En el programa hay una casilla de "spin factor" donde se aumenta/ralentiza la velocidad de giro de las acciones.

 

Estas rutinas han sido un arduo trabajito ya que no dispongo ni tampoco he encontrado ningún algoritmo para tener una referencia....

 

problemas con las texturas:

 

1- tal como dice Marcos, las texturas que desaparecen; el zbuffer está activado; descartado... no idea de qué puede ser...

 

2- cuando activo los mag y min filter elijo el D3DTEXF_LINEAR, que corrige el problema de las texturas pixeladas cerca de la pantalla, pero al mismo tiempo se nota un efecto muy feo en las conjunciones de los poligonos. no tengo idea de por qué.

si no lo activo, se ve todo el render pixelado pero no me sale el efecto feo.

los problemas 1 y 2, supongo que están relacionados de algun modo... help!

 

:(

Prototipo2.rar

Enlace al comentario
Compartir en otros sitios web

Hola Dario.

 

Acabo de probar el segundo prototipo. Primero, en mi lado del mundo tira un mensaje de error que dice "0,1" is not a valid floating point value", este mensaje lo tira en cada loop y hay que matar la tarea para cancelar el programa.Este mensaje creo lo tira la funcion "strtofloat" o cualquier otra funcion que uses para convertir texto a numeros y la conversion falla. A menos que le indiques lo contrario los compiladores de borland obtienen desde la configuracion regional de la computadora que simbolos se utilizan para separar decimales y miles; tu programa usa coma para separar decimales pero en las computadoras donde la configuracion regional tiene selcionado el simbolo punto para separar decimales entonces tu programa no puede hacer la conversion.

 

Ok, solucioné el problema cambiando en el control panel, configuracion regional el simbolo de separacion de decimales; ahora el programa me corre bien, y el factor 0,1 para rotar, mover y zoom me funciona perfecto en mi computadora, esto me permite examinar y evaluar mejor el renderizado.

 

Ya no uso mas el objeto Timer, me decidí por implementar el evento de sistema OnIdle.

 

Eso esta muy bien, el evento oniddle es lo correcto a usar cuando se esta programando con los compiladores borland y este tipo de aplicaciones graficas. Pero deves de tener claro algo: todo el codigo que escribas dentro del evento onidle se ejecutará a la velocidad maxima posible por la computadora; eso esta muy bien porque mientras mas poder se tenga mejor, pero cuando tu aplicacion necesite mostrar algun tipo de animacion ó hacer algo que deva de ejecutarse en la misma cantidad de tiempo en todas las computadoras entonces necesitaras una manera de condicionar ciertas lineas de codigo dentro del oniddle a que se ejecuten solo si a transcurrido cierta cantidad de tiempo desde la ultima vez que se ejecutó.

Para eso necesitas programar unas rutinitas o un objeto que te da la cantidad de milisegundos que han trascurrido entre un evento y otro. Una de las instrucciones mas faciles para hacer eso es utilizar el comando de windows "gettickcount" el cual devuelve la cantidad de milisegundos transcurridos desde que se encendió la computadora, esto seria mas o menos haci:

 

contador:=0; //al inicio del programa.

 

//dentro de un bucle

tiempo = Gettickcount;

if (tiempo-contador)>30 then

begin

ejecutar_animacion; //esto se ejecutará aprox cada 30 milisegundos en cualquier computadora.

contador:=tiempo;

end;

 

 

La funcion gettickcount es muy facil pero los profesionales te diran que para medir tiempo mejor la sustituyas por un par de instrucciones llamadas QueryPerformanceFrequency y QueryPerformanceCounter las cuales juntas de dan mediciones en milisegundos mas exactos de lo que te da el gettickcount; te dejo de tarea que investigues esas instrucciones.

 

2- cuando activo los mag y min filter elijo el D3DTEXF_LINEAR, que corrige el problema de las texturas pixeladas cerca de la pantalla, pero al mismo tiempo se nota un efecto muy feo en las conjunciones de los poligonos. no tengo idea de por qué.

si no lo activo, se ve todo el render pixelado pero no me sale el efecto feo.

 

Ok, el problema de que se notan unas rayas en los bordes de los polygonos se deve a que no esta del todo bien el calculo de los UV de las texturas que obtienes desde tomb raider; ya habras notado que los UV en TR tienen su complicacion; parece que te esta fallando el UV por uno o dos pixeles.

 

1- tal como dice Marcos, las texturas que desaparecen; el zbuffer está activado; descartado... no idea de qué puede ser...

 

Ahora con tu opcion de rotar manualmente el mesh pude examinar mas detenidamente este sintoma, definitivamente el problema es el zbuffer, solo sucede con los polygonos que "pelean" por una misma posicion en la direccion de la vista.

 

Obvio, el SetRenderState(D3DRS_ZENABLE, TRUE ); esta activado, de lo contrario se veria mucho peor, pero tambien revisa la documentacion, creo que hay otros parametros relacionados con el zbufer aparte de activarlo o no.

 

Cuando estas haciendo el device, verifica si tienes:

 

_d3dpp.EnableAutoDepthStencil := true;

_d3dpp.AutoDepthStencilFormat := D3DFMT_D16; // 16-bit z-Buffer

 

No importa si el device va a estar en 32 bit, 24 bits o 16 bits, el AutoDepthStencilFormat ponlo siempre a 16 bits.

 

*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??

 

Cuando creas las texturas utiliza la bandera D3DPOOL_MANAGED, de esa manera cuando se arruine el device no tienes que cargar las texturas ya que el directx automaticamente guarda una copia en en memoria del sistema y tu solo tienes que recrear el viewport ya sea desde 0 o con el reset. En tu caso que las texturas tendrian que leerse desde el tr4 no es practico tener que estar abriendo y parseando el formato tr4 para obtener las texturas cada vez que se arruina el device; pero no todos los juegos y aplicaciones guardan las texturas de esa manera; muchos video juegos y programas guardan las texturas de una manera mas accesible.

 

suerte.

Enlace al comentario
Compartir en otros sitios web

Ya implementé el algoritmo que me permite recueperar el device en caso de que se pierda. Todos los recursos los defino como POOL_MANAGED y tan solo necesito llamar a la funcion Reset con el nuevo formato de video y funciona!!! :P

 

Lo que me tiene realmente mal es el tema de las texturas...

 

Siguen persistiendo esos efectos feos de que algunos poligonos parpadean y otros no se ven bien.

Estoy usando el z stencil buffer activado con el valor de D3DFMT_16.... , pero sigue igual. mhhmhhhhhhhmhmh

 

otra cosa: en el IDE ¿ como hago en el compilador para configurar entre la coma y el punto en los flotantes?

 

saludos!

Enlace al comentario
Compartir en otros sitios web

otra cosa: en el IDE ¿ como hago en el compilador para configurar entre la coma y el punto en los flotantes?

 

Oh, que descuido, se me olvido decirte eso en el post anterior.

 

En los compiladores de borland hay unas variables globales del sistema a las que solo tienes que leer o escribir valores para cambiar la configuracion:

 

al inicio del programa en el el evento de la creacion de la forma escribe:

 

//numeric international setting changed to american way.

decimalseparator:='.';

ThousandSeparator:=',';

 

Utiliza los separadores que tu programa espera leer desde texto a numeros.

 

Siguen persistiendo esos efectos feos de que algunos poligonos parpadean y otros no se ven bien.

Estoy usando el z stencil buffer activado con el valor de D3DFMT_16.... , pero sigue igual. mhhmhhhhhhhmhm

 

un largo hmmmm de echo... muestrame que parametros tienes en el D3DXMatrixPerspectiveFovLH

 

Claramente veo que el problema son con los polygonos que se pelean entre si para ver quien se dibuja primero, dime como estas haciendo las conversion de los vertices de tomb raider a directx, estas usando numeros flotantes verdad?, no deves de usar enteros, y deves de cambiar esos valores a cantidades mas pequeñas, es decir si en tomb raider dice 1024 deves de cambiarlo a 1.024 ( yo utilizo punto para separado de decimales). envez de mil veinte y cuatro se pasa a uno punto cero veinte y cuatro.

Enlace al comentario
Compartir en otros sitios web

gracias natalie

 

1) ya implementé el tema del punto flotante.

 

2) ya solucioné el tema de los poligonos que se pelean por verse uno mas cerca que el otro. Tal cual me dices, reduje la escala diviendo las coordenadas de los vertices (en mi caso por 10) y ahora se renderizan perfectamente! Gracias Natalie

 

el tema del calculo exacto del UV no lo pude solucionar con ese algoritmo , pero creo saber por donde viene la mano.

Dejo el prototipo aquí.

gl.

 

=======EDIT DE HOY====

 

Ya aprendí a construir un mesh tree con un algoritmo muy bueno.

Ya se pueden renderizar los moveables.

 

La primera parte del proyecto ya está hecha. Aprender a implementar bien las rutinas de directx 8, para mostrar una buena gráfica.

Estuve atascado como casi 1 mes sin dar la solución a un pequeño problemita, pero ya se arregló.

Lo que viene es estrictamente programación Tomb Raider; es algo mas "desconocido" para mí, y como se acerca semana de exámenes voy a tener que hacer una pausa....

 

Dejo el prototipo ^_^

proto5.rar

Enlace al comentario
Compartir en otros sitios web

  • 3 weeks later...

Lo acabo de probar y me funciona, lo que noto con este nuevo photo6 es que el spin de los objetos, bien moveables o estáticos es casi incontrolable a la hora de intentar girarlos con el botón derecho, con la tecla Ctrl y May. se controla bien.

 

No afecta si altero el Spin factor de 1.2 a un factor menor

 

Yo prefería la visualización de las Lara animation de la versión photo4 donde solo se veía las armas y no el mesh del dummy de Lara.

 

Bueno ya puestos, explícame que se supone que es el KaliyaMerger? :)

 

Saludos y keep it up .__.

Enlace al comentario
Compartir en otros sitios web

Lo acabo de probar y me funciona, lo que noto con este nuevo photo6 es que el spin de los objetos, bien moveables o estáticos es casi incontrolable a la hora de intentar girarlos con el botón derecho, con la tecla Ctrl y May. se controla bien.

 

No afecta si altero el Spin factor de 1.2 a un factor menor

 

Yo prefería la visualización de las Lara animation de la versión photo4 donde solo se veía las armas y no el mesh del dummy de Lara.

 

Bueno ya puestos, explícame que se supone que es el KaliyaMerger? :D

 

Saludos y keep it up 8)

 

el tema del spin factor es algo complejo.Lo hice con un algoritmo que yo mismo inventé y los valores para algunas máquinas son distintos para que se vea bien. En mi compu es de 1.2. Creo que hay que ir probando...

 

Kaliya Merger es un proyecto super secreto, jeje, al principio( como todo), se ve "fácil" de proyectar, pero en el andar las cosas se van poniendo bastante complicadas. Asi que el objetivo prefiero reservarlo por el momento.

 

bueno che ya falta poco para las vacaciones... :)

 

wiiiiiiiiiioi :P

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