Asignación de entorno cúbico (Direct3D 9)

Mapas de entorno cúbicos, a veces denominados mapas de cubos, son texturas que contienen datos de imagen que representan la escena que rodea a un objeto, como si el objeto estuviera en el centro de un cubo. Cada cara del mapa de entorno cúbico cubre un campo de vista de 90 grados en la horizontal y vertical, y hay seis caras por mapa de cubo. La orientación de las caras se muestra en la ilustración siguiente.

ilustración de un cubo con ejes de coordenada central perpendiculares a caras de cubo

Cada cara del cubo está orientada perpendicular al plano x/y, y/z o x/z, en el espacio mundial. En la ilustración siguiente se muestra cómo corresponde cada plano a una cara.

ilustración de caras de cubo con proyecciones de coordenadas de planos

Los mapas de entorno cúbicos se implementan como una serie de objetos de textura. Las aplicaciones pueden usar imágenes estáticas para la asignación de entornos cúbicos, o pueden representarse en las caras del mapa de cubo para realizar la asignación dinámica del entorno. Esta técnica requiere que las superficies del mapa de cubo sean superficies de destino de representación válidas, creadas con el conjunto de marcas D3DUSAGE_RENDERTARGET.

Las caras de un mapa de cubo no necesitan contener representaciones extremadamente detalladas de la escena circundante. En la mayoría de los casos, los mapas de entorno se aplican a superficies curvadas. Dada la cantidad de curvatura usada por la mayoría de las aplicaciones, la distorsión reflectante resultante hace un detalle extremo en el mapa del entorno desperdiciado en términos de sobrecarga de memoria y representación.

Mapas de entorno cúbicos de Mipmapped

Los mapas de cubo pueden ser mipmapped. Para crear un mapa de cubo mipmapped, establezca el parámetro Levels del método CreateCubeTexture en el número de niveles que desee. Puede visualizar la topografía de estas superficies como se muestra en el diagrama siguiente.

diagrama de un mapa de cubo mipmapped con n niveles mip

Las aplicaciones que crean mapas de entorno cúbico mipmapped pueden acceder a cada cara llamando al método GetCubeMapSurface . Comience estableciendo el valor adecuado del tipo enumerado D3DCUBEMAP_FACES, como se describe en Creación de superficies de mapa de entorno cúbicos (Direct3D 9). A continuación, seleccione el nivel que se va a recuperar estableciendo el parámetro de nivel GetCubeMapSurface en el nivel de mapa mip que desee. Recuerde que 0 corresponde a la imagen de nivel superior.

Coordenadas de textura para mapas de entorno cúbicos

Las coordenadas de textura que indexen un mapa de entorno cúbico no son coordenadas de estilo u simples, como se usa cuando se aplican texturas estándar. De hecho, los mapas de entorno cúbicos no usan coordenadas de textura en absoluto. En lugar de un conjunto de coordenadas de textura, los mapas de entorno cúbico requieren un vector 3D. Debe tener cuidado de especificar un formato de vértice adecuado. Además de indicar al sistema cuántos conjuntos de coordenadas de textura usa la aplicación, debe proporcionar información sobre cuántos elementos hay en cada conjunto. Direct3D ofrece el conjunto D3DFVF_TEXCOORDSIZEN de macros para este fin. Estas macros aceptan un único parámetro, que identifica el índice del conjunto de coordenadas de textura para el que se describe el tamaño. En el caso de un vector 3D, se incluye el patrón de bits creado por la macro D3DFVF_TEXCOORDSIZE3. En el ejemplo de código siguiente se muestra cómo se usa esta macro.

// Create a flexible vertex format descriptor for a vertex that contains
//   a position, normal, and one set of 3D texture coordinates.

DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0); 

En algunos casos, como la asignación de luz difusa, se usa el vértice de espacio de cámara normal para el vector. En otros casos, como la asignación de entorno especular, se usa un vector de reflexión. Dado que los normales de vértices transformados se comprenden ampliamente, la información aquí se concentra en calcular un vector de reflexión.

La computación de un vector de reflexión por su cuenta requiere comprender la posición de cada vértice y de un vector desde el punto de vista a ese vértice. Direct3D puede calcular automáticamente los vectores de reflexión para la geometría. El uso de esta característica ahorra memoria porque no es necesario incluir coordenadas de textura para el mapa de entorno. También reduce el ancho de banda y, en el caso de un dispositivo HAL de T&L, puede ser significativamente más rápido que los cálculos que la aplicación puede realizar por sí mismo. Para usar esta característica, en la fase de textura que contiene el mapa de entorno cúbico, establezca el estado de fase de textura de D3DTSS_TEXCOORDINDEX en una combinación del D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR miembro de D3DTEXTURESTAGESTATETYPE y el índice de un conjunto de coordenadas de textura. En algunas situaciones, como la asignación de luz difusa, puede usar el miembro D3DTSS_TCI_CAMERASPACENORMAL de D3DTEXTURESTAGESTATETYPE, lo que hace que el sistema use el vértice transformado, el espacio de cámara y el vértice normal como vector de direccionamiento para la textura. El sistema solo usa el índice para determinar el modo de ajuste de la textura.

En el ejemplo de código siguiente se muestra cómo se usa este valor.

// The m_d3dDevice variable is a valid pointer
// to an IDirect3DDevice9 interface.

// Automatically generate texture coordinates for stage 2.
// This assumes that stage 2 is assigned a cube map.
// Use the wrap mode from the texture coordinate set at index 1.

m_d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX,
                                   D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR | 1); 

Al habilitar la generación automática de coordenadas de textura, el sistema usa una de las dos fórmulas para calcular el vector de reflexión para cada vértice. Cuando el D3DRS_LOCALVIEWER estado de representación se establece en TRUE, se usa la fórmula siguiente.

fórmula del vector de reflexión (r = 2(exn)n-e)

En la fórmula anterior, R es el vector de reflexión que se calcula, E es el vector de posición a ojo normalizado y N es el vértice de espacio de cámara normal.

Cuando el D3DRS_LOCALVIEWER estado de representación se establece en FALSE, el sistema usa la fórmula siguiente.

fórmula del vector de reflexión (r = 2nzn-i)

Los elementos R y N de esta fórmula son idénticos a la fórmula anterior. El elemento NZ es el espacio mundial z del vértice normal, y yo es el vector (0,0,1) de un punto de vista infinitamente lejano. El sistema usa el vector de reflexión de cualquiera de las fórmulas para seleccionar y dirigir la cara adecuada del mapa del cubo.

Nota

En la mayoría de los casos, las aplicaciones deben habilitar la normalización automática de los normales de vértices. Para ello, establezca D3DRS_NORMALIZENORMALS en TRUE. Si no habilita este estado de representación, la apariencia del mapa del entorno será drásticamente diferente de la esperada.

 

La información adicional se incluye en el tema siguiente.

Asignación de entornos