Поделиться через


Использование сопоставления ударов (Direct3D 9)

Обнаружение поддержки сопоставления ударов

Устройство может выполнять сопоставление ударов, если оно поддерживает операцию D3DTOP_BUMPENVMAP или D3DTOP_BUMPENVMAPLUMINANCE текстуры. Используйте IDirect3D9::CheckDeviceFormat с D3DUSAGE_QUERY_LEGACYBUMPMAP, чтобы узнать, поддерживается ли формат для сопоставления ударов.

Кроме того, приложения должны проверка возможности устройства, чтобы убедиться, что устройство поддерживает соответствующее количество этапов смешивания,обычно не менее трех, и предоставляет по крайней мере один формат пикселей для сопоставления бампинга.

В следующем примере кода проверяются возможности устройства для обнаружения поддержки сопоставления ударов на текущем устройстве с использованием заданных критериев.

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;
}

Создание текстуры карты бампов

Вы создаете текстуру карты ударов, как и любую другую текстуру. Приложение проверяет поддержку сопоставления бампов и получает допустимый формат пикселей, как описано в разделе Обнаружение поддержки сопоставления бампов.

После создания поверхности можно загрузить каждый пиксель с соответствующими значениями дельта и яркостью, если формат поверхности включает светимость. Значения для каждого компонента пикселей описаны в разделе Форматы пикселей карты bump (Direct3D 9).

Настройка параметров сопоставления бампов

Когда приложение создало карту ударов и задало содержимое каждого пикселя, можно подготовиться к отрисовке, настроив параметры сопоставления бампов. Параметры сопоставления бампов включают настройку необходимых текстур и их операций смешивания, а также элементы управления преобразованием и яркостью для самой карты бампов.

  1. Задайте базовую карту текстур , если используется, карту бампов и текстуры карты среды в этапы смешения текстур.
  2. Задайте цветовые и альфа-операции наложения для каждого этапа текстуры.
  3. Задайте матрицу преобразования карты бампов.
  4. При необходимости задайте значения шкалы яркости и смещения.

В следующем примере кода три текстуры (базовая карта текстур, карта бампов и карта зеркальной среды) задаются соответствующими этапами наложения текстур.

// Set the three textures.
d3dDevice->SetTexture( 0, d3dBaseTexture );
d3dDevice->SetTexture( 1, d3dBumpMap );
d3dDevice->SetTexture( 2, d3dEnvMap );

После установки текстур на этапы смешивания в следующем примере кода выполняется подготовка операций смешения и аргументов для каждого этапа.

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

Если заданы операции смешения и аргументы, в следующем примере кода матрица сопоставления бампов 2x2 присваивается матрице идентификации, задав для D3DTSS_BUMPENVMAPMAT00 и членов D3DTSS_BUMPENVMAPMAT11 D3DTEXTURESTAGESTATETYPE значение 1.0. Установка матрицы для удостоверения приводит к тому, что система будет использовать разностные значения на карте ударов без изменений, но это не является обязательным требованием.

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

Если для операции сопоставления ударов задано включение яркости (D3DTOP_BUMPENVMAPLUMINANCE), необходимо задать элементы управления яркостью. Элементы управления яркостью настраивают способ вычисления яркости системой перед модуляцией цвета текстуры на следующем этапе. Дополнительные сведения см. в разделе Формулы сопоставления бампов (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) );

После того как приложение настроит параметры сопоставления ударов, оно может отрисовыться в обычном режиме, а отрисованные многоугольникам получить эффекты сопоставления ударов.

Обратите внимание, что в предыдущем примере показаны параметры, заданные для сопоставления зеркальной среды. При выполнении сопоставления диффузного света приложения настраивают операцию смешивания текстур для последнего этапа D3DTOP_MODULATE. Дополнительные сведения см. в разделе Карты диффузного света (Direct3D 9).

Сопоставление бампов