Использование сопоставления ударов (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).
Настройка параметров сопоставления бампов
Когда приложение создало карту ударов и задало содержимое каждого пикселя, можно подготовиться к отрисовке, настроив параметры сопоставления бампов. Параметры сопоставления бампов включают настройку необходимых текстур и их операций смешивания, а также элементы управления преобразованием и яркостью для самой карты бампов.
- Задайте базовую карту текстур , если используется, карту бампов и текстуры карты среды в этапы смешения текстур.
- Задайте цветовые и альфа-операции наложения для каждого этапа текстуры.
- Задайте матрицу преобразования карты бампов.
- При необходимости задайте значения шкалы яркости и смещения.
В следующем примере кода три текстуры (базовая карта текстур, карта бампов и карта зеркальной среды) задаются соответствующими этапами наложения текстур.
// 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).
Связанные темы