Partilhar via


Mapeamento de ambiente cúbico (Direct3D 9)

Mapas de ambiente cúbico - às vezes referidos como mapas de cubo - são texturas que contêm dados de imagem que representam a cena ao redor de um objeto, como se o objeto estivesse no centro de um cubo. Cada face do mapa do ambiente cúbico cobre um campo de visão de 90 graus na horizontal e vertical, e há seis faces por mapa de cubo. A orientação dos rostos é mostrada na ilustração a seguir.

ilustração de um cubo com eixos de coordenadas centrais perpendiculares às faces do cubo

Cada face do cubo é orientada perpendicularmente ao plano x/y, y/z ou x/z, no espaço mundial. A ilustração a seguir mostra como cada plano corresponde a um rosto.

ilustração das faces do cubo com projeções de coordenadas a partir de planos

Os mapas de ambiente cúbico são implementados como uma série de objetos de textura. Os aplicativos podem usar imagens estáticas para mapeamento de ambiente cúbico ou podem renderizar nas faces do mapa de cubo para executar o mapeamento dinâmico do ambiente. Essa técnica requer que as superfícies do mapa de cubo sejam superfícies de destino de renderização válidas, criadas com o D3DUSAGE_RENDERTARGET sinalizador definido.

Os rostos de um mapa de cubo não precisam conter renderizações extremamente detalhadas da cena ao redor. Na maioria dos casos, os mapas de ambiente são aplicados a superfícies curvas. Dada a quantidade de curvatura usada pela maioria dos aplicativos, a distorção reflexiva resultante torna os detalhes extremos no mapa do ambiente desperdiçados em termos de memória e sobrecarga de renderização.

Mapas de Ambiente Cúbico Mipmap

Os mapas cúbicos podem usar mipmaps. Para criar um mapa de cubo mipmap, defina o parâmetro Levels do métodoCreateCubeTexture para o número de níveis desejado. Você pode visualizar a topografia dessas superfícies, conforme mostrado no diagrama a seguir.

diagrama de um mapa de cubo mapeado mipmapeado com n níveis de MIP

Os aplicativos que criam mapas de ambiente cúbico com mipmaps podem acessar cada face chamando o método GetCubeMapSurface. Comece por estabelecer o valor apropriado do tipo enumerado D3DCUBEMAP_FACES, conforme discutido em Criando superfícies de mapa de ambiente cúbico (Direct3D 9). Em seguida, selecione o nível a ser recuperado definindo o parâmetro GetCubeMapSurface level para o nível mipmap desejado. Lembre-se de que 0 corresponde à imagem de nível superior.

Coordenadas de textura para mapas de ambiente cúbico

As coordenadas de textura que indexam um mapa de ambiente cúbico não são coordenadas simples de estilo u, v, como usado quando texturas padrão são aplicadas. Na verdade, os mapas de ambiente cúbico não usam coordenadas de textura. Em vez de um conjunto de coordenadas de textura, os mapas de ambiente cúbico requerem um vetor 3D. Você deve ter cuidado para especificar um formato de vértice adequado. Além de informar ao sistema quantos conjuntos de coordenadas de textura seu aplicativo usa, você deve fornecer informações sobre quantos elementos estão em cada conjunto. O Direct3D oferece o D3DFVF_TEXCOORDSIZEN conjunto de macros para esta finalidade. Essas macros aceitam um único parâmetro, identificando o índice do conjunto de coordenadas de textura para o qual o tamanho está sendo descrito. No caso de um vetor 3D, você inclui o padrão de bits criado pela macro D3DFVF_TEXCOORDSIZE3. O exemplo de código a seguir mostra como essa macro é usada.

// 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); 

Em alguns casos, como o mapeamento de luz difusa, você usa o vértice de espaço de câmera normal para o vetor. Em outros casos, como o mapeamento de ambiente especular, você usa um vetor de reflexão. Como os vértices normais transformados são amplamente compreendidos, as informações aqui se concentram na computação de um vetor de reflexão.

Calcular um vetor de reflexão por conta própria requer a compreensão da posição de cada vértice, e de um vetor do ponto de vista para esse vértice. O Direct3D pode calcular automaticamente os vetores de reflexão para a sua geometria. O uso desse recurso economiza memória porque você não precisa incluir coordenadas de textura para o mapa do ambiente. Ele também reduz a largura de banda e, no caso de um dispositivo T&L HAL, pode ser significativamente mais rápido do que os cálculos que seu aplicativo pode fazer por conta própria. Para usar esta funcionalidade, no estágio de textura que contém o mapa de ambiente cúbico, defina o estado do estágio de textura D3DTSS_TEXCOORDINDEX como uma combinação do membro D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR de D3DTEXTURESTAGESTATETYPE e do índice de um conjunto de coordenadas de textura. Em algumas situações, como o mapeamento de luz difusa, pode-se usar o membro D3DTSS_TCI_CAMERASPACENORMAL de D3DTEXTURESTAGESTATETYPE, o que faz com que o sistema use o normal do vértice transformado no espaço da câmara como vetor de endereçamento para a textura. O índice só é usado pelo sistema para determinar o modo de empacotamento para a textura.

O exemplo de código a seguir mostra como esse valor é usado.

// 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); 

Quando você habilita a geração automática de coordenadas de textura, o sistema usa uma das duas fórmulas para calcular o vetor de reflexão para cada vértice. Quando o estado de renderização D3DRS_LOCALVIEWER é definido como TRUE, a fórmula a seguir é usada.

fórmula do vetor de reflexão (r = 2(exn)n-e)

Na fórmula anterior, R é o vetor de reflexão que está sendo calculado, E é o vetor normalizado de posição para olho e N é o vértice de espaço de câmera normal.

Quando o estado de renderização D3DRS_LOCALVIEWER é definido como FALSE, o sistema usa a seguinte fórmula.

fórmula do vetor de reflexão (r = 2NZN-i)

Os elementos R e N nesta fórmula são idênticos à fórmula anterior. O elemento NZ é o espaço-mundo z do vértice normal, e I é o vetor (0,0,1) de um ponto de vista infinitamente distante. O sistema usa o vetor de reflexão de qualquer fórmula para selecionar e abordar a face apropriada do mapa do cubo.

Observação

Na maioria dos casos, os aplicativos devem permitir a normalização automática de vértices normais. Para fazer isso, defina D3DRS_NORMALIZENORMALS para TRUE. Se você não habilitar esse estado de renderização, a aparência do mapa de ambiente será drasticamente diferente do que você poderia esperar.

 

Informações adicionais estão contidas no tópico a seguir.

Mapeamento de Ambiente