Determinar que hay en el campo de visión (Frustum Culling).
- Capitulo IX de la serie "Diario de un sufrido programador de DirectX" -


Autor  

 Lord Trancos

Ámbito  

 Matemáticas.

Lenguaje de Programación  

 Delphi 4

Fecha  

 2001/09/07

Índice

    

    I - Introducción.
    II - Que es el frustum?
    III - Que es el frustum culling?

    IV - Acerca del ejemplo. 

    V - Descargar el ejemplo.

 


I - Introducción

Hasta ahora (en los ejemplos que hemos visto), todo los poligonos que formaban la escena eran enviados al DirectX para que se encargara él de renderizarlos. Esta actitud, aunque comoda, supone que en numerosas ocasiones estamos enviandole al DirectX poligonos que no apareceran en pantalla por el simple hecho de no estar en el campo de vision. Así que es el DirectX el que se tiene que encargar, poligono a poligono, de determinar que poligonos estan dentro de nuestro campo de visión. Eso supone un tiempo de procesamiento, o en otras palabras; menos frames por segundo para nuestro juego.



II - Que es el frustum?

El frustum, es el campo de visión. Consiste en una especie de piramide que abarca todo lo que es visible, entendiendo como visible todos aquellos poligonos que se verian en pantalla si otros poligonos no los taparán. Se trata de una piramide con la cima cortada, por lo que tiene 6 lados (los cuatro lados, la base, y la cima). Esa piramide se representa mediante 6 planos infinitos. Todo lo que se encuentre dentro de esos seis planos es visible.

Si no lo entendeis no os preocupeis (ya se que me explico muy mal); en el ejemplo existe la posibilidad de bloquear el frustum, entonces aparecera dibujada la piramide y seguramente lo comprendereis.



III - Que es el frustum culling?

El frustum culling, es la tecnica que nos permite averiguar que se encuentra dentro del frustum (es decir, en nuestro campo de vision). Esto permite evitar enviar poligonos que no van a verse al DirectX. Esos poligonos se descartan o se aceptan por grupos, ya que para realiar comprobaciones poligono por poligono tenemos al DirectX que lo hace por nosotros. 

Normalmente los grupos de poligonos que queremos comprobar se agrupan dentro de volumenes simples; como por ejemplo una esfera (Bounding Sphere) o una caja alineada con los ejes de coordenadas (Axis Aligned Bounding Box o AABB). Si la esfera o la caja no estan fuera del frustum, dibujaremos los poligonos en cuestion.

Por ejemplo, en un juego de naves podemos asignar a cada nave una esfera o una caja AABB. Si la esfera o la caja se encuentra dentro del frustum, le diremos al DirectX que renderize la nave. De este modo evitamos renderizar todas las naves que no estan en nuestro campo de vision.

Por supuesto el frustum culling tambien se puede utiliar para el escenario. Pero antes deberiamos de partirlo a trozos (space partitioning). Así, si partimos el escenario en octrees o en sectores, el frustum culling nos permite averiguar que cubos del octree son visibles o cuales de los portales que unen los sectores son visibles; pero esto es ya otra historia. ;-)



IV - Acerca del ejemplo

El código fuente mas importante del ejemplo se encuentra en la unit frustum.pas. En ella encontraras una funcion llamada "frustumExtract" para obtener el frustum (los 6 planos que lo forman) a partir de las matrices VIEW y PROJECTION. Por lo que deberas de llamar a esta funcion cada vez que modifiques esas matrices. El resto de funciones te serviran para comprobar si un punto, una esfera, un AABB o un triangulo se encuentran dentro del frustum. El codigo fuente de frustum.pas esta basado en el tutorial de "frustum culling" de Mark Morley.

El ejemplo muestra una pequeña esfera roja (que es el centro sobre el que rota la camara), 3 esferas con 4096 poligonos cada una (si no me equivoco) y una caja. Al mover la camara en determinados angulos, las esferas o la caja desapareceran del campo de vision (osea del frustum), por lo que no seran enviados al DirectX para que los intente dibujar. Si desactivais el frustum culling (Culling Type: none) observareis que cuando las 3 esferas grandes no son visibles el numero de frames es menor que si activais el frustum culling. Tambien podeis bloquear el frustum (tecla L) para asi poder observar la piramide, y como SOLO lo que se encuentra dentro de ella es renderizado cuando el frustum culling esta activado.



V - Descargar el ejemplo.

Descargar el ejemplo.

Para compilar este ejemplo necesitaras las cabeceras de DirectX 8 para Delphi de Delphi-Jedi y el Delphi 4 o superior. La libreria D3DX8ab.dll se encuentra junto estas cabeceras.


 

 
Hosted by www.Geocities.ws

1