Um dispositivo pode executar o mapeamento de rugosidade se suportar a operação de mistura de texturas D3DTOP_BUMPENVMAP ou D3DTOP_BUMPENVMAPLUMINANCE. Use IDirect3D9::CheckDeviceFormat com D3DUSAGE_QUERY_LEGACYBUMPMAP para ver se um formato é suportado para mapeamento de impactos.
Além disso, os aplicativos devem verificar os recursos do dispositivo para garantir que o dispositivo suporte um número apropriado de estágios de mistura, geralmente pelo menos três, e expõe pelo menos um formato de pixel de mapeamento de colisão.
O exemplo de código a seguir verifica os recursos do dispositivo para detetar suporte para mapeamento de colisão no dispositivo atual, usando os critérios fornecidos.
BOOL SupportsBumpMapping()
{
D3DCAPS9 d3dCaps;
d3dDevice->GetDeviceCaps( &d3dCaps );
// Does this device support the two bump mapping blend operations?
if ( 0 == d3dCaps.TextureOpCaps & ( D3DTEXOPCAPS_BUMPENVMAP |
D3DTEXOPCAPS_BUMPENVMAPLUMINANCE ))
return FALSE;
// Does this device support up to three blending stages?
if( d3dCaps.MaxTextureBlendStages < 3 )
return FALSE;
return TRUE;
}
Criando uma textura de mapa de colisão
Você cria uma textura de mapa de colisão como qualquer outra textura. Seu aplicativo verifica o suporte para mapeamento de colisão e recupera um formato de pixel válido, conforme discutido em Detetando suporte para mapeamento de colisão.
Depois de criar a superfície, pode carregar cada pixel com os valores delta apropriados e a luminância, se o formato da superfície incluir a luminância. Os valores para cada componente de pixel são descritos em Bump Map Pixel Formats (Direct3D 9).
Configurando parâmetros de mapeamento de colisão
Quando a aplicação tiver criado um mapa de relevo e definido o conteúdo de cada pixel, pode-se preparar para a renderização configurando os parâmetros de mapeamento de relevo. Os parâmetros de mapeamento de colisões incluem a definição das texturas necessárias e suas operações de mistura, bem como os controles de transformação e luminância para o próprio mapa de colisão.
Defina o mapa de textura base, se usado, o mapa de relevo e as texturas do mapa de ambiente nos estágios de mistura de textura.
Defina as operações de mistura de cor e alfa para cada estágio de textura.
Defina a matriz de transformação do mapa de colisão.
Defina a escala de luminância e o deslocamento de valores conforme necessário.
O exemplo de código a seguir define três texturas (o mapa de textura base, o mapa de solavancos e um mapa de ambiente especular) para os estágios de mistura de textura apropriados.
// Set the three textures.
d3dDevice->SetTexture( 0, d3dBaseTexture );
d3dDevice->SetTexture( 1, d3dBumpMap );
d3dDevice->SetTexture( 2, d3dEnvMap );
Depois de definir as texturas para seus estágios de mistura, o exemplo de código a seguir prepara as operações de mistura e argumentos para cada estágio.
// Set the color operations and arguments to prepare for
// bump mapping.
// Stage 0: The base texture
d3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
d3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
d3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
d3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 1 );
// Stage 1: The bump map - Use luminance for this example.
d3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
d3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_BUMPENVMAPLUMINANCE);
d3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
// Stage 2: A specular environment map
d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 0 );
d3dDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_ADD );
d3dDevice->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );
Quando as operações de mistura e os argumentos são definidos, o exemplo de código a seguir define a matriz de mapeamento de relevo 2x2 como matriz de identidade, ao definir os membros D3DTSS_BUMPENVMAPMAT00 e D3DTSS_BUMPENVMAPMAT11 de D3DTEXTURESTAGESTATETYPE como 1.0. Definir a matriz para a identidade faz com que o sistema use os valores delta no mapa de colisão sem modificações, mas isso não é um requisito.
// Set the bump mapping matrix.
//
// Note These calls rely on the following inline shortcut function:
// inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT00, F2DW(1.0f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT01, F2DW(0.0f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT10, F2DW(0.0f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT11, F2DW(1.0f) );
Se você definir a operação de mapeamento de colisão para incluir luminância (D3DTOP_BUMPENVMAPLUMINANCE), deverá definir os controles de luminância. Os controles de luminância configuram como o sistema calcula a luminância antes de modular a cor da textura na próxima etapa. Para obter detalhes, consulte Bump Mapping Formulas (Direct3D 9).
// Set luminance controls. This is only needed when using
// a bump map that contains luminance, and when the
// D3DTOP_BUMPENVMAPLUMINANCE texture blending operation is
// being used.
//
// Note These calls rely on the following inline shortcut function:
// inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVLSCALE, F2DW(0.5f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVLOFFSET, F2DW(0.0f) );
Depois que seu aplicativo configura os parâmetros de mapeamento de impacto, ele pode renderizar como normal e os polígonos renderizados recebem efeitos de mapeamento de impacto.
Observe que o exemplo anterior mostra parâmetros definidos para mapeamento de ambiente especular. Ao executar o mapeamento de luz difusa, os aplicativos definem a operação de mistura de textura para o último estágio como D3DTOP_MODULATE. Para obter mais informações, consulte Diffuse Light Maps (Direct3D 9).
Dowiedz się, jak utworzyć scenę 3D w środowisku Unity przy użyciu zestawu SDK usługi Microsoft Maps lub statycznego terenu. Zapoznaj się z projektowaniem scen rzeczywistości mieszanej, interfejsem Unity oraz wdrażaniem projektu Unity na urządzeniu rzeczywistości mieszanej.