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 »

Javi SJ Cervera

 Hola. Estoy usando IrrLicht con el renderer de Direct3D9, y me da problemas muy feos de Z-Buffer:



En otros engines esto no ocurre, así que supongo que habrá algún parámetro en Direct3D que permita solucionar esto... ¿alguien me puede echar una mano?
== Jedive ==

Haddd

 El rango del ZBuffer viene dado por los parámetros near y far plane de la cámara. Si hay mucha diferencias entre ellos, puedes tener estos problemas. Compruebalo  ;)  

_Grey

 O lo que es lo mismo, problemas de precision. Si tu near plane es 1, y tu fear plane es 1.000.000 y tienes un Zbuffer de 24bits, con esos 24bits tiene que controlar la distancia de cada pixel, pero si pones un fear plane de 1.000, esos 24bits del Zbuffer pueden ser mucho mas precisos.

Reduce tu fear plane, supongo que los renders de grandes distancias son ya otro tema  ;)

Saludos.

Javi SJ Cervera

 Gracias por vuestra respuesta. ¿Cómo se define el tamaño del z-buffer? ¿Cual es el valor recomendado?
== Jedive ==

Pablo Zurita

 Teniendo en cuenta que sus el Irrlicht seguramente el engine define las funciones internas para cambiar el depth buffer entre 16 y 24 bits, y también para cambiar el znear y el zfar (supongo esto porque debe tener una interfaz común para todo los rasterizers que soporta). Con respecto al valor, mira que la diferencia entre el znear y el zfar sea lo menor posible teniendo en cuenta tus necesidades, lo único que tenes que tener en cuenta es que el znear no sea 0. También mira http://msdn.microsoft.com/archive/default....onTransform.asp.

ethernet

 Cuidado con los planos y con la resolución. Esta web explica muy bien qué pasa cuando pasa lo que pasa -> http://www.sjbaker.org/steve/omniv/love_yo...r_z_buffer.html

Lord Trancos 2

 De irrlicht ni papa, pero buscando he encontrado esta web:

http://irrlicht.sourceforge.net/docu/class...scene_node.html

donde pone que tienes que usar los metodos .setNearValue y setFarValue

En la web que te ha puesto ethernet, viene muy bien explicado lo del z-buffer.

Lo ideal es usar un z-buffer de 24bits (lo normal hoy en dia), 16 es poco. Pero lo realmente importante es indicar unos valores correctos para el Near y el Far.

Sobre como indicarle a Irrlitcht el tamaño del z-buffer... ni papa.
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

Lord Trancos 2

 Investigando un poquito mas... este es en mi opinion el sitio mas adecuado donde se le deberia de poder indicar al Irrlicht el tamaño del z-buffer;

http://irrlicht.sourceforge.net/docu/struc...parameters.html

pero no esta...

Tal vez no se pueda y sea el motor el que eliga por ti...  :(  
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

Javi SJ Cervera

 Gracias a todos por vuestras respuestas. Me referia a cambiar el tamaño del z-buffer en Direct3D directamente, no en IrrLicht.
== Jedive ==

_Grey

 Si usas una libreria sobre Direct3D quiza no puedas cambiarlo, pero de todas formas... el atributo AutoDepthStencilFormat de la estructura D3DPRESENT_PARAMETERS que le pasas a CreateDevice() es el responsable de esto.

Pero no seria bueno que tocaras esto, no es raro dejar al usuario que elija lo que prefiera; lo mejor es que reduzcas la distancia del farplane.

Javi SJ Cervera

 Ok, pues según veo, IrrLicht fija el tamaño del buffer a D3DFMT_D16, cambiandolo a D3DFMT_D24S8 mejora la calidad de renderer. ¿Recomendáis algún otro valor, o con este se obtiene buen resultado?
== Jedive ==

senior wapo

 D24X8 si D24S8 te falla ya que hay tarjetas que no soportan stencil.

Mirate éste link para que veas que formatos estan implementados REALMENTE en el hardware instalado por ahí y pasa de los listados que salen en la documentación de los APIs Direct3D y OpenGL (mucha teoría). Lo mismo va por los formatos de texturas normales y como rendertargets.



Capacidades de las tarjetas de video más comunes

Suerte.

zupervaca

 En la matriz de proyeccion define 1.0f como el plano z mas cercano, lo mas seguro que te lo arregle esto. Ahora supongo que tendras puesto 0.1f.

Miki

Prueba también con una escala de escenario más pequeña. Es decir, si tienes una medida en 3DS Max (por ejemplo unas dimensiones de 100.000 x 100.000 x 100.000 unidades) escala a 10.000 o a 1.000. Imagina que cada unidad en MAX sea como 1 metro en la vida real. Con esto consigues buenos resultados sin tener que cambiar el far y el near plane y usando incluso z-buffer de 16 bits.

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






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.