Luces y Texturas - PowerPoint PPT Presentation

1 / 14
About This Presentation
Title:

Luces y Texturas

Description:

Luces y Texturas. Francisco Javier Tirado Sarti. fjtirado_at_lucent.com ... color final del v rtice a partir de las luces en escena. ... luces direccionales. ... – PowerPoint PPT presentation

Number of Views:126
Avg rating:3.0/5.0
Slides: 15
Provided by: Dan8181
Category:
Tags: luces | texturas

less

Transcript and Presenter's Notes

Title: Luces y Texturas


1
Luces y Texturas
  • Francisco Javier Tirado Sarti
  • fjtirado_at_lucent.com

2
Componentes de la luz
  • En Direct3D cada luz consta de tres componentes,
    todos ellos expresados como un D3DColorValue o
    D3DXColor
  • Ambiente, luz independiente de la posición que
    ilumina todos los objetos de la escena por igual
  • Difusa, luz que viaja en una dirección particular
    y que sale reflejada en todas direcciones. Para
    saber la cantidad que llega a un objeto, hay que
    tener en cuenta la orientación del mismo respecto
    a la fuente de luz y el material activo
  • Specular, luz que viaja en una dirección
    particular y que sale reflejada en una sola
    dirección. Por ello, para su calculo, además de
    la orientación y del material, hay que tener en
    cuenta la posición de la cámara. La luz especular
    es costosa computacionalmente y tiene que
    habilitarse explícitamente usando
    IDirect3DDevice9SetRenderState(
    D3DRS_SPECULARENABLE, TRUE )

3
Luz
  • En Direct3D una fuente de luz se representa
    mediante la estructura D3DLight9
  • Hay tres tipos de fuente de luz
  • D3DLIGHT_POINT. Un punto que emite luz en todas
    las direcciones. Tiene posición, pero no
    dirección
  • D3DLIGHT_SPOT Similar a la luz emitida por una
    linterna, se define mediante dos ángulos, que
    definen sendos conos, interno (Theta), externo
    (Sigma)
  • D3DLIGHT_DIRECTIONAL Un haz de rayos paralelos en
    una dirección determinada, carente de posición.
  • Una luz se añade a la escena asociándola a un
    entero positivo mediante el método
    IDirect3DDevice9SetLight (DWORD id, D3DLight9
    light)
  • Una vez añadida la luz se puede
    activar/desactivar usando IDirect3DDevice9LightE
    nable(DWORD id,BOOL on)
  • El modelo de luz Direct3D puede deshabilitarse
    por completo usando IDirect3DDevice9SetRenderSta
    te(D3DRS_LIGHTING,FALSE)

4
Tipos de Luz
5
Material
  • La cantidad de luz que refleja un objeto
    determinado viene dado por el material activo
  • Un material esta representado por la estructura
    D3DMaterial9, y en el se especifica la cantidad
    que se refleja para cada tipo de luz (ambiente,
    especular, difusa)
  • Por ejemplo si nuestras fuentes de luz emiten
    solo color rojo y el material activo solo refleja
    el azul, el objeto se vera negro
  • El campo emissive simula luz propia del objeto y
    se utiliza para dotar a determinados objetos de
    mayor brillo
  • El campo power se utiliza para potenciar el
    efecto causado por la luz especular.
  • El material activo en la escena (el material no
    se asocia a un objeto, sino al device, de forma
    que todos los objetos a partir del momento en que
    se fija un material se dibujan como si estuvieran
    asociados a éste) se establece con
    IDirect3DDevice9SetMaterial(D3DMaterial9)

6
Normales
  • Direct3D utiliza la componente normal del vértice
    en su ecuación para el calculo del color final
    del vértice a partir de las luces en escena.
  • Dicha componente puede rellenarse a mano porque
    se conoce de antemano o puede calcularse a partir
    de la posición de los vértices. El método mas
    simple es igualar la normal de los vértices del
    triangulo a la normal de la cara que forman. O lo
    que es lo mismo, si p0, p1 y p2 son los vértices
    del triangulo y n0, n1 y n2 las normales que
    queremos calcular, entonces siendo u p1-p0, v
    p2-p1, la normal de los tres vertices es el
    vector resultado de efectuar el producto
    vectorial de u y v, usando la funcion
    D3DXVec3Cross(D3DXVECTOR result, D3DXVECTOR u,
    D3DXVECTORv). El resultado hay que normalizarlo
    usando D3DXVec3Normalize (D3DXVECTOR3
    out,D3DXVECTOR3in)
  • Para superficies curvas simuladas con triangulos
    la normal del vértice es la media de las normales
    de las 3 caras del triangulo
  • Como parte del paso de coordenadas en el mundo a
    coordenadas de camara los vectores normales
    pueden dejar de estar normalizados, podemos
    decirle a Direct3D que los vuelva a normalizar
    mediante la llamada SetRenderState(D3DRS_NORMALIZE
    NORMALS,TRUE)

7
Ecuación luz difusa
  • Simplemente como curiosidad, la ecuación que se
    utiliza para calcular la componente difusa del
    vértice es sumML(N.DIR)Atenuación donde
  • M es el color difuso del material activo
  • L es el color difuso de la fuente de luz
  • N.DIR es el producto escalar de la normal del
    vértice por la dirección de la luz (para una luz
    posicional el vector dirección es el producto
    vectorial normalizado de la posición del vértice
    por la de la luz)
  • Atenuación es 1 para luces direccionales. Para
    posicionales sigue la ecuación 1/(Attenuation0Att
    enuation1dAttenuation2dd) donde d es la
    distancia de la luz al vértice. Si la distancia
    es mayor que Range entonces Atenuación es 0.

8
Ejercicio
  • En el tutorial 4 del SDK
  • Cambiar la luz direccional blanca del ejemplo
    por una luz roja sita en la posición de la
    cámara.
  • Probar a apagar la luz
  • Cambiar el color del material con el que se
    dibuja el cilindro

9
Textura
  • Una textura es un mapa de bits que se aplica
    sobre un objeto 3d transformado.
  • Cada bit de la textura se conoce como texel. Un
    texel viene dado por dos coordenadas (u, que es
    el equivalente al eje X y v, que lo es al eje Y,
    con la peculiaridad de que se incrementa al ir
    hacia abajo)
  • Para hacer corresponder cada vértice del
    triangulo con un texel en la textura, añadimos la
    constante D3DFVF_TEX1 a nuestro FVF, así como dos
    nuevos campos u y v a nuestra estructura vértice.
  • Por defecto, el color final del píxel es una
    mezcla del color resultado de aplicar la
    interpolación (Gouraud) del color de los vértices
    y del color del texel

10
Cargar texturas
  • Las texturas son mapas de bits que se almacenan
    en ficheros tipo BMP, JPG, TGA
  • En Direct3D una textura se representa mediante el
    interface IDirect3DTexture9
  • Para cargar una textura usaremos la función
    D3DXCreateTextureFromFile( LPDIRECT3DDEVICE9
    pDevice, LPCTSTR pSrcFile, LPDIRECT3DTEXTURE9
    ppTexture )
  • pDevice es el puntero a IDirect3DDevice9
  • pSrcFile es el nombre del fichero que contiene la
    textura
  • ppTexture nos devuelve la referencia a una
    instancia de IDirect3DTexture9
  • Una vez cargada la textura se puede aplicar
    mediante el metodo IDirect3DDevice9SetTexture(DW
    ORD Sampler, IDirect3DBaseTexture9 pTexture)
  • Sampler es un numero positivo que identifica la
    textura. El numero máximo esta limitado por las
    capacidades del dispositivo
  • pTexture es la referencia a la textura
  • Una vez activa, esa textura se aplicara a todos
    los objetos que se dibujen a continuación. Para
    desactivarla hay que usar método SetTexture
    especificando como segundo parámetro NULL

11
Filtros
  • Normalmente el tamaño del triangulo en la textura
    no es igual al tamaño del triangulo en la
    pantalla. Cuando es menor, se agranda (magnify).
    Cuando es mayor, se reduce (minify). Esto produce
    cierta distorsion que se corrige mediante la
    aplicación de filtros
  • Los filtros se establece mediante el metodo
    IDirect3DDevice9SetSamplerState( DWORD Sampler,
    D3DSAMPLERSTATETYPE tipo, DWORD valor) donde
    sampler es el identificador de la textura y tipo
    es D3DSAMP_MINFILTER (a aplicar cuando se reduce)
    o D3DSAMP_MAGFILTER (a aplicar cuando se agranda)
  • El valor puede ser
  • Bilinear (D3DTEXF_LINEAR). Da buenos resultado
    con poco coste computacional.
  • Anisotropico(D3DTEXF_ANISOTROPIC). Resultados
    óptimos pero consumiendo mas hardware.
    D3DTEXF_ANISOTROPIC. Además, hay que hacer una
    llamada extra a SetSamplerState pasando como tipo
    D3DSAMP_MAXANISOTROPY y como valor el nivel de
    filtrado deseado.

12
Mipmaps
  • Para evitar que el efecto de distorsión sea muy
    acusado, Direct3D genera automáticamente
    versiones con diferente resolución de la misma
    textura, a los que se conoce como Mipmap chain.
  • El tipo de Mipmapping deseado se controla
    llamando al metodo SetSamplerState
    (Sampler,D3DSAMP_MIPFILTER,filter) donde filter
    puede ser
  • D3DTEXF_NONE. Deshabilita el mipmapping
  • D3DTEXF_POINT. Se escoge el mipmap mas cercano en
    tamaño al triangulo
  • D3DTEXF_LINEAR. Se cogen los dos mipmap mas
    cercanos, se aplican los filtro especificados a
    cada uno y se interpola entre ambos

13
Address Mode
  • Aunque en teoría u y v estan restringidas al
    rango 0,1, puede suceder que su valor sea
    mayor. En esos casos entra el juego el
    addressMode que se fija usando SetSampleState
    (Sampler,D3DSAMP_ADDRESSU,valor) y SetSampleState
    (Sampler,D3DSAMP_ADDRESSV,valor) donde valor
    pueder ser
  • Wrap mode. (D3DTADDRESS_WRAP)
  • Border color mode (D3DTADDRESS_BORDER)
  • Clamp mode (D3DTADDRESS_CLAMP)
  • Mirror mode (D3DTADDRESS_MIRROR)

14
Ejercicio
  • Aplicar una textura sobre el triangulo del
    tutorial 3 del SDK
  • Leer el código del Tutorial 5 y tratar de
    entenderlo buscando en la ayuda los posibles usos
    del método setTextureStageState (no explicados en
    esta presentación puesto que en realidad los
    definidos en el tutorial son los establecidos por
    defecto)
  • Conseguir que el cilindro aparezca verde sin
    cambiar de textura.
Write a Comment
User Comments (0)
About PowerShow.com