Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Creación De Espejos

Iniciado por vincent, 10 de Diciembre de 2004, 02:53:00 PM

« anterior - próximo »

vincent

 Hola muy buenas,

estoy intentando implementar espejos en mi motor basado en portal rendering. En principio la idea es sencilla: proyecto el punto de vista respecto el plano del espejo i renderizo desde allí.

Esto da un error obvio que es que la escena en el espejo no queda recortada como deberia

Yo creo que esto se arregla poniendo el near plane de la camara reflejada conicidiendo con el plano del espejo. Me equivoco?

Si no me equivoco, alguien sabe como hacerlo en DirectX? He visto una función llamada SetClipPlane pero no sé exactamente que plano es el near ni como especificarlo.

Gracias!
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

Pogacha

 Y la primera idea que se me ocurre es reflejar la matriz de proyeccion con el plano pero ni idea de que puede resultar de esto.

Lo que haria en todo caso seria reflejar el mundo (a traves del model-view) con

P = Plano_del_Espejo
V = vertice
V´= vertice reflejado

V´= V + P.Normal * -P.Distancia(V) * 2.0; //  reflejacion, (se aproxima un ataque marciano!)

Y bueno ideate como meter eso en la matriz model view, ahora no recuerdo ni tengo como para deducirlo.
El nuevo frustrum tambien ha de estar invertido al igual que el front_face o sea invertir el culling.

CitarYo creo que esto se arregla poniendo el near plane de la camara reflejada conicidiendo con el plano del espejo. Me equivoco?

No, supuestamente no hay forma geometricamente para que tengas este problema, pero no debes dibujar mas alla del espejo cuando recorras los portales.

Ademas reflejar el ojo no te servira de nada (no es así como funcionan los espejos), el espejo invierte la profunidad.

No es la solucion pero espero darte idea.
Saludos.

PD: Me podrias tirar info sobre el metodo de portales que usas?, no estoy conforme con el mio... <_<

BeRSeRKeR

 En el SDK de DX había un ejemplo (Clip Mirror) que utilizaba la función D3DXMatrixReflect para calcular la matriz de vista utilizando el plano del espejo y después utilizaba los "user clipping planes" para hacer el clipping. Uno por cada arista del espejo. Como dice Pogacha también tendrás que invertir el cull mode.

Si puedes consíguete ese ejemplo. Desgraciadamente ya no viene con el último SDK.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

vincent

 Perfecto gracias! Os informaré de mis avances. He conseguido el ejemplo del clip mirror. Veremos que se puede hacer.

El método que utilizo para el portal rendering es proyectar los portales en 2D, calcularle la caja contenedora y calcular el nuevo frustum a partir de esta caja. De momento me va bastante bien. Eso si, lo tengo que probar con una escena cargadita...

Saludos!
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

Pogacha

 Pero no te sirven los clip planes pues es un portal rendering o sea puedes seguir entrando en otros sectores con portales, lo que debes hacer es reflejar el frustrum actual como si estuvieras en otro lado y seguir recursando a traves de los portales.

El reflect de la matriz (model view) lo tengo en casa, si me acuerdo esta noche te lo traigo ( o tarde o mañana, estoy en -3 h con greenwhich, creo que ustedes estan en 0 o +1 ?).

Saludos
PD: En serio me interesa el saber como haces el portal rendering ;)

Edit:
ya habias posteado.  :P
Te preguntaba mas bien si sobre si hacias render a medida que recursabas, y como definias los sectores con un arbol bsp o que?

BeRSeRKeR

 Vincent, en este artículo explican cómo hacer los espejos utilizando RTT (el ejemplo del Clip Mirror creo que utiliza el stencil buffer).

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Pogacha

 Ese esta bueno, aun que siendo un poco lento de todas formas me parece interesante, pues te permite espejos semitransparentes.
Le vere otra ojeada mas en detalle.

vincent

 Efectivamente a mi tb me parece que lo de girar el mundo dará problemillas con el portal rendering. Como os he dicho antes yo lo que hacia es reflejar el frustum con el plano del portal y pintar lo que veo a una textura para después ponerla en el espejo. El problema es que al irse el frustum al otro lado, la escena se ve como si yo estuviera en la otra habitación y no refleja bien. Por eso os decia lo de avanzar el near al plano del espejo. Sé que me explico fatal, pero no me funciona el puñetero ftp...  (grrr)

A la hora de pintar el portal rendering, primero lo recorro todo, relleno un vector y despues lo pinto todo. A mi me va un poco más rápido así que no ir pintando a medida que lo recorro. A parte, para el tema de objetos con transparencia, me permite ordenarlos todos y pintarlos al final.

Taluego!

PD: el ejemplo del clipmirror no utiliza stencil.  
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

vincent

 Vamos a ver,

dada la naturaleza de mi portal rendering ( primero seleccionar y después pintar ), he optado por una solución híbrida. En la etapa de selección, invierto el frustum para seleccionar lo que necesito y en la etapa de pintado reflejo la world y pinto con los planos de clipping activados. Hasta aqui cojonudo, la idea deberia funcionar.

He probado los planos de clipping y cada uno por separado funcionan bien ( el de arriba, el de la derecha, el de la izquierda y el de abajo ). El tema es que cuando los activo todos a la vez sólo me actuan dos ( el de abajo y el de la derecha )  (nooo) . Sabeis porque me puede pasar esto?

Gracias!
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

BeRSeRKeR

 Tienes que tener en cuenta que (si no recuerdo mal) cada clipping plane te consume un texture stage. Puede ser por eso...

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

vincent

 Y esto pq c... no lo ponen en la documentación?

Pues tendré que mirarme con atención el articulo que me comentásteis el otro dia para ver como lo hace exactamente...

Alguna otra idea de como hacerlo? ( sin usar el stencil plis )

Taluego!

VinCenT.
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

BeRSeRKeR

 Te pongo un extracto de este artículo en el que habla de los user clipping planes:

CitarUser Clip Planes can be set by the developer to clip triangles with the help of the graphics card, that are outside of these planes and therefore to reduce the number of calculations. How to set User Clip Planes is shown in the Direct3D 8.1 example named "Clip Mirror" and in the ATI RADEON 8500 Nature demo. The RADEON and RADEON 8500 support six independant user clip planes in hardware. The clip planes on the GeForce 1/2/3/4TI chips are implemented using texture stages. That means that two User Clip Planes you use, eat up one texture stage.

    It looks like NVIDIA no longer exposes the cap bits for these.The DirectX Caps Viewer reports MaxUserClipPlanes == 0 since the release of the 12.41 drivers.

One alternative to clip planes is shown in the "TexKillClipPlanes" example delivered in the NVIDIA Effects Browser, where the pixel shader instruction texkill is used to get a similar functionality like clip planes.

Another alternative to clip planes is guard band clipping as supported by GeForce hardware [Dietrich01]. The basic idea of guard band clipping is that hardware with a guard band region can accept triangles that are partially or totally off-screen, thus avoiding expensive clipping work. There are four cap fields for Guard Band support in the D3DCAPS8 structure: GuardBandLeft, GuardBandRight, GuardBandTop, and GuardBandBottom. These represent the boundaries of the guard band. These values have to be used in the clipping code. Guard band clipping is handled automatically by switching on clipping in Direct3D.

Según eso las aceleradoras Radeon más modernas no consumirían texture stages, aunque no deja muy claro si nVidia sigue dando soporte a los clipping planes, supongo que sí. De todas formas también habla de otras alternativas a los user clipping planes.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Pogacha

 Sobre el tema de los clipping planes:

http://developer.nvidia.com/object/IO_2001...10903_3281.html
Baja el pdf, en la seccion que habla de Cull_Fragment, habla sobre el uso de los clip_planes usando la instruccion que despues se llamo kill,  4 * unidad de textura o sea usando 2 texturas como difusa*lightmaps aun contarias con 8 clip planes.

Saludos.






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.