Terrain Rendering - PowerPoint PPT Presentation

1 / 9
About This Presentation
Title:

Terrain Rendering

Description:

Cada celda de la matriz esta compuesta por dos tri ngulos. ... la nieve y a los mas cercanos al nivel del mar un color similar al de una playa. ... – PowerPoint PPT presentation

Number of Views:50
Avg rating:3.0/5.0
Slides: 10
Provided by: Dan8181
Category:
Tags: la | playa | puesto | que | rendering | terrain

less

Transcript and Presenter's Notes

Title: Terrain Rendering


1
Terrain Rendering
  • Francisco Javier Tirado Sarti
  • fjtirado_at_lucent.com

2
Introducción
  • Un terreno no es más que una malla
    tridimensional, con pequeñas alteraciones en la
    altura de los vértices, sobre la que se aplica
    una textura
  • Se representa mediante una matriz de nm vértices
    separados entre si por una distancia d, que
    definen un total de (n-1)(m-1) celdas cuadradas.
  • Cada celda de la matriz esta compuesta por dos
    triángulos. Luego el numero total de triángulos
    es (n-1)(m-1)2
  • La altura del vértice ij viene dado por el valor
    de la matriz en la fila i, columna j

3
HeightMap
  • Consiste en un fichero bmp de nm píxeles donde
    el valor de cada píxel representa la altura
  • Se utilizan 8 bit para cada pixel, lo que da un
    total de 255 posibles valores para la altura.
  • Los valores negros (cercanos a 0) representan
    zonas bajas. Los blancos (cercanos a 255) las
    mayores elevaciones.
  • Para el caso de que necesitemos mas de 255
    valores para la altura se utiliza un factor de
    escalado.
  • Este tipo de ficheros RAW se pueden generar
    usando Adobe Photoshop
  • Posteriormente el fichero se procesa por parte de
    la aplicación, generándose un array de enteros en
    memoria, de manera que la altura del vértice ij
    viene dada por la entrada inj del array

4
Generando la geometría
  • Los pasos para construir un objeto de la clase
    terreno son
  • Leer el bitmap con la información de la altura
  • Crear el VertexBuffer y el IndexBuffer
    correspondientes
  • Crear una textura
  • Iluminar la textura
  • El VertexBuffer constara de nm vértices. La
    componente z (las filas de la matriz) se calcula
    iterando desde (m-1)d/2 hasta (m-1)d/2 sumando
    d en cada iteración. Mientras que la componente x
    (las columnas de la matriz) se calcula haciendo
    lo mismo desde -(n-1)d/2 hasta (n-1)d/2. La
    componente y nos la da el heightMap
  • El IndexBuffer constara de (n-1)(m-1) triángulos.
    Dada la celda cuyo vértice superior izquierdo es
    el vértice ij, el IndexBuffer contendrá entradas
    para los dos triángulos compuestos por los
    vertices (ij, i1j, ij1) y (ij1,i1j, i1j1),
    proceso que hay que repetir para cada celda.
  • La coordenadas u y v del vértice (que no tiene
    normal puesto que la luz la calcularemos
    manualmente) son iguales a j/(n-1) y i/(m-1)

5
Textura
  • La textura a aplicar sobre el terreno puede
    cargarse desde un fichero o puede generarse a
    partir de una textura vacía, con formato
    D3DFMT_X8R8G8B8 y tamaño nm, asignando un color
    a cada texel en función de la altura del vértice.
    De manera que a los texels mas elevados les
    asignaremos un color blanco que simule la nieve y
    a los mas cercanos al nivel del mar un color
    similar al de una playa.
  • Para modificar directamente el contenido de una
    textura se utiliza el método HRESULT LockRect(
    UINT Level, D3DLOCKED_RECT pLockedRect, CONST
    RECT pRect, DWORD Flags )
  • Level es 0 ya queremos modificar el primer nivel.
  • pLockedRect nos devuelve el puntero a la
    estructura D3DLOCKED_RECT
  • En flags ponemos 0
  • La estructura D3DLOCKED_RECT consta de dos campos
  • INT Pitch la anchura de la textura
  • VOID pBits el puntero al valor de los texels,
    del que en nuestro caso al tener la textura el
    formato arriba mencionado, se puede hacer casting
    a D3DCOLOR (un valor de 32 bits que representa el
    color)
  • Para cambiar el valor del texel ij, hay que
    acceder a la posición iPitch/4j, puesto que el
    Pitch viene expresado en bytes.

6
Iluminación
  • En lugar de calcular la iluminación en tiempo
    real, la luz que incide sobre el terreno se
    precalcula cuando este se construye con lo que se
    gana rendimiento
  • Para ello recorreremos de nuevo la textura (bien
    haya sido generada por el procedimiento anterior,
    bien haya sido cargada desde un fichero),
    multiplicando el color previamente asignado por
    el resultado del producto escalar de la normal de
    la celda por la dirección de la luz.
  • La normal se calcula a partir de dos vectores no
    paralelos y coplanares con la celda. Si ABC son
    los vértices de un triangulo de la celda entonces
    U (d,By-Ay,0) y V (0,Cy-Ay,-d), siendo la
    normal el resultado del producto vectorial de U
    por V.
  • Una vez hecho esto, desbloqueamos el nivel 0
    mediante el método IDirect3DTexture9UnlockRect(0
    ) y le decimos a DirectX que rellene los otros
    niveles de filtrado de la textura con la función
    D3DXFilterTexture( LPDIRECT3DBASETEXTURE9
    pBaseTexture, CONST PALETTEENTRY pPalette, UINT
    SrcLevel, DWORD MipFilter )
  • donde pBaseTextura es la textura
  • pPalette es la paleta por defecto, NULL
  • srcLevel es el nivel a partir del cual generamos
    los demas, en nuestro caso 0
  • MipFilter es el tipo de filtrado, en nuestro caso
    D3DX_DEFAULT

7
Altura
  • Con el fin de ubicar correctamente la altura de
    la cámara cuando esta ha sido creada en modo
    suelo, necesitamos una manera de obtener la
    coordenada y a partir de las coordenadas x y z
  • Es un arduo proceso que se puede resumir en los
    siguientes pasos
  • El primero consiste en llevar x y z al origen
    (sumándole width/2 a x y restándole depth/2 a z)
    y convertir d en 1 (dividiendo x y z entre d), de
    manera que podamos usar la parte entera de x y z
    para indexar la matriz que contiene las alturas
    de los vértices de la celda (a las que llamaremos
    A,B,C y D)
  • Una vez hecho esto hay que determinar en que
    triangulo de la celda están x y z. Si dz (z menos
    su parte entera) es menor que 1 dx, entonces
    está en el triangulo superior. Si no, en el
    inferior.
  • Por ultimo, las formulas para el triangulo
    superior (ABC) e inferior (CBD) son
  • A (B-A)dx (C-A)dz
  • D (C-D)(1dx) (B-D)(1-dz)

8
Dibujando el terreno
  • Simplemente consistirá en dibujar el IndexBuffer
    calculado durante la construcción, activando la
    textura correspondiente.
  • Hay que deshabilitar la luz, ya que no queremos
    que Direct3D la calcule al haberlo hecho ya
    nosotros
  • Hay que asegurarse que el filtrado bilinear esta
    activo o veremos los bordes de las celdas

9
Ejercicio
  • Implementar la clase Terrain y dibujarla.
Write a Comment
User Comments (0)
About PowerShow.com