Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas De Z-buffer En Direct3d

Iniciado por Javi SJ Cervera, 08 de Mayo de 2006, 03:51:59 PM

« anterior - próximo »

TurBo_biT

Cita de: "marcode"Estoy con zupervaca en que lo mejor es modificar ese valor de la matriz de proyección, y voy más allá creando una función que lo haga mediante el valor pasado.

Antes de cada dibujo y cuando sea necesario se llama a esa función pasando un valor alto para dibujar por ejemplo unos edificios a lo lejos, y un valor pequeño para el interior de un coche.

No sé si es muy exagerado hacer esto, pero yo no veo otra solución para poder dibujar escenas correctamente en las que se combinan objetos grandes muy lejanos, y objetos muy cercanos.

Pero supongo que eso no se puede hacer a cada objeto, ya que entonces cambias la base sobre la que se calcula el zbuffer, dando resultados erroneos, es una suposicion, no lo he probado.

zupervaca

No se si Jedive sigue con el problema, pero no hay que complicarse tanto la vida para solucionar un fallo de estos, yo lo tuve en el dibMotor que hice hace unos añucos con direct3d, el problema era el que mencionaba, ponia que el plano mas cercano era 0.1f, pero al cabo de investigar un tiempo nada mas que puse 1.0f me funciono a la perfeccion, pero es un 1.0f para todo, es decir creamos la matriz de proyeccion con el plano mas cercano en 1.0f siempre.

marcode

Cita de: "zupervaca"No se si Jedive sigue con el problema, pero no hay que complicarse tanto la vida para solucionar un fallo de estos, yo lo tuve en el dibMotor que hice hace unos añucos con direct3d, el problema era el que mencionaba, ponia que el plano mas cercano era 0.1f, pero al cabo de investigar un tiempo nada mas que puse 1.0f me funciono a la perfeccion, pero es un 1.0f para todo, es decir creamos la matriz de proyeccion con el plano mas cercano en 1.0f siempre.

Yo el problema que tenía es que si alejaba el plano como dices, los objetos muy cercanos a la cámara desaparecían, por lo que tuve que adoptar la solución de modificarla dinámicamente (no individualmente para cada render), pero sí de manera específica para algunos.

Pruébalo en más circustancias, quizás con ese valor, te acercas demasiado a un muro con una cámara en 1ª persona y ves lo que hay detrás, otras veces puedes querer ver muy de cerca un objeto, como si fueras una hormiga.

Cita de: "TurBo_biT"
Pero supongo que eso no se puede hacer a cada objeto, ya que entonces cambias la base sobre la que se calcula el zbuffer, dando resultados erroneos, es una suposicion, no lo he probado.

Pues esa suposición también la tuve yo, pero el caso es que funciona, aunque no sé si en todas las circunstancias.

Pongamos un ejemplo, tienes unas montañas a 10 km, y un mapa a 20 cm de la cara (que es la cámara), ves el mapa, pero las montañas hacen el efecto chungo de solapamiento (que ahora no me acuerdo como se llama), alejas el plano y ya se ven bien las montañas, pero el mapa desaparece porque el corte queda a 30 cm. A menos que yo esté confundido algo así es lo que ocurre.

No veo otra solución que modificar la proyección específicamente antes de renderizar cada uno de ellos, es un proceso sencillo puesto que solo hay que obtener la matriz de proyección, modificar la z, y reestablecerla, Aunque tal vez no convenga abusar de ello hasta el punto de modificarla para cada render.

Lo que hice fué adoptar para todos un valor intermedio, que creo que era 0.8, y después para los dibujos críticos por su distancia extremamente cercana o lejana modificar individualmente la matriz justo antes de dibujar.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Jare

Cita de: "marcode"Pongamos un ejemplo, tienes unas montañas a 10 km, y un mapa a 20 cm de la cara (que es la cámara)
[...]
No veo otra solución que modificar la proyección específicamente antes de renderizar cada uno de ellos
Creo que el Quake 1 modificaba la matriz para pintar el arma; esto es bastante habitual en los FPS, pero muy concreto y fácil de separar. Los problemas pueden venir si tienes objetos a 10 km, 1 km, 100m, 1m, 10cm, etc. El suelo que ves (y que forma las montañas al fondo) está esparcido por todas esas distancias, de forma contínua. ¿Dónde pones el corte?

Los primeros juegos que mostraban grandes extensiones de mundo con aceleración 3D hacían diabluras de este estilo con la matriz de proyección (el Project IGI en particular, pedazo de motor que se curraron), pero hay que tener siempre presente que no es una solución genérica que "simplemente funciona", hay que poner los cortes y separar los elementos de la escena con mucho cuidadito.






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.