Mapeamento de ambiente cúbico (Direct3D 9)

Mapas de ambiente cúbico - às vezes chamados de 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 de ambiente cúbico cobre um campo de exibiçã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 a faces de cubo

Cada face do cubo é orientada perpendicular 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 de rostos de cubo com projeções de coordenadas de planos

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 ser renderizados nas faces do mapa de cubo para executar o mapeamento dinâmico do ambiente. Essa técnica exige que as superfícies de mapa de cubo sejam superfícies de destino de renderização válidas, criadas com o sinalizador D3DUSAGE_RENDERTARGET 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 com mipmapped

Mapas de cubo podem ser mipmapped. Para criar um mapa de cubo mipmapped, defina o parâmetro Levels do método CreateCubeTexture como o número de níveis desejados. Você pode imaginar a topografia dessas superfícies, conforme mostrado no diagrama a seguir.

diagrama de um mapa de cubo mipmapped com n níveis de mip

Os aplicativos que criam mapas de ambiente cúbico mipmapped podem acessar cada rosto chamando o método GetCubeMapSurface . Comece definindo o valor apropriado do tipo enumerado D3DCUBEMAP_FACES , conforme discutido em Criando Superfícies de Mapa do Ambiente Cúbico (Direct3D 9). Em seguida, selecione o nível a ser recuperado definindo o parâmetro de nível GetCubeMapSurface para o nível de 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, conforme usado quando texturas padrão são aplicadas. Na verdade, os mapas de ambiente cúbico não usam coordenadas de textura. No lugar de um conjunto de coordenadas de textura, os mapas de ambiente cúbico exigem um vetor 3D. Você deve tomar 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 essa 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 bit 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 mapeamento de luz difuso, você usa o vértice de espaço da câmera normal para o vetor. Em outros casos, como o mapeamento de ambiente especular, você usa um vetor de reflexão. Como os normais de vértice 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 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 sua geometria. O uso desse recurso salva a 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 esse recurso, no estágio de textura que contém o mapa do ambiente cúbico, defina o estado D3DTSS_TEXCOORDINDEX estágio de textura como uma combinação do membro D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR de D3DTEXTURESTAGESTATETYPE e o índice de um conjunto de coordenadas de textura. Em algumas situações, como o mapeamento de luz difuso, você pode usar o D3DTSS_TCI_CAMERASPACENORMAL membro de D3DTEXTURESTAGESTATETYPE, o que faz com que o sistema use o vértice normal transformado, espaço de câmera e vértice como o vetor de endereçamento para a textura. O índice só é usado pelo sistema para determinar o modo de disposição da 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 D3DRS_LOCALVIEWER estado de renderização é 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 da câmera normal.

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

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 mundial z do vértice normal, e eu sou 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 habilitar a normalização automática de normais de vértice. Para fazer isso, defina D3DRS_NORMALIZENORMALS como TRUE. Se você não habilitar esse estado de renderização, a aparência do mapa do ambiente será drasticamente diferente do esperado.

 

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

Mapeamento de ambiente