На данный момент я портирую старый код из девятой версии DirectX в более новую, одиннадцатую, и столкнулся с некоторыми трудностями в поиске аналогов существующих свойств и функций.
Параметры отображения в старой версии (DirectX9):
technique tAccessory
{
pass p0
{
VS_COMPILE_COMMAND VS();
PS_COMPILE_COMMAND PS(true);
AlphaBlendEnable = true;
SrcBlend = SrcAlpha;
DestBlend = InvSrcAlpha;
ZFunc = LESSEQUAL;
AlphaTestEnable = true;
AlphaRef = 1;
AlphaFunc = GreaterEqual;
}
pass p1
{
VS_COMPILE_COMMAND VS();
PS_COMPILE_COMMAND PSAccessoryAlpha();
AlphaBlendEnable = true;
SrcBlend = SrcAlpha;
DestBlend = One;
ZFunc = LESSEQUAL;
AlphaTestEnable = true;
AlphaRef = 1;
AlphaFunc = GreaterEqual;
}
}
Функции VS, PS, PSAccessoryAlpha
самописные, определяют положение текстур и альфа.
Проблема заключается в отсутствии этих параметров в новой версии DirectX 11:
AlphaBlendEnable = true;
SrcBlend = SrcAlpha;
DestBlend = One;
ZFunc = LESSEQUAL;
AlphaTestEnable = true;
AlphaRef = 1;
AlphaFunc = GreaterEqual;
Мне удалось выяснить, что с помощью функции SetBlendState
можно задать следующие параметры:
ДиректХ9:
AlphaBlendEnable = true;
SrcBlend = SrcAlpha;
DestBlend = InvSrcAlpha;
ДиректХ11:
BlendState BSAlphaBlending
{
BlendEnable[0] = true;
SrcBlend = SRC_ALPHA;
DestBlend = INV_SRC_ALPHA;
};
SetBlendState( BSAlphaBlending, float4( 0, 0, 0, 0 ), 0xffffffff );
А для случая, когда DestBlend = One
:
ДиректХ9:
AlphaBlendEnable = true;
SrcBlend = SrcAlpha;
DestBlend = One;
ДиректХ11:
BlendState BSSrcAlphaDestOne
{
BlendEnable[0] = true;
SrcBlend = SRC_ALPHA;
DestBlend = ONE;
};
SetBlendState( BSSrcAlphaDestOne, float4( 0, 0, 0, 0 ), 0xffffffff );
А вот как портировать в DirectX11 остальные параметры, такие как:
ДиректХ9:
ZFunc = LESSEQUAL;
AlphaTestEnable = true;
AlphaRef = 1;
AlphaFunc = GreaterEqual;
В версии 9 для них было перечисление D3DRENDERSTATETYPE
и можно было указать нужные параметры с помощью функции SetRenderState
, но какой аналог этой функции в версии 11?
Во-первых, вы используете устаревшую систему эффектов (FX), поэтому обязательно загляните на GitHub, чтобы узнать последнюю версию и ограничения.
Для Direct3D 11 вам необходимо выяснить перестановки комбинаций состояний и создать для них объекты состояний (вам нужно установить 5 объектов, а не сотню маленьких отдельных переключателей). Например, ZFunc является частью объекта DepthStencilState.
Обратите внимание, что функция «альфа-тестирования» устаревшего конвейера с фиксированными функциями не существует в конвейере программируемых шейдеров. Для его реализации вы можете использовать код шейдера HLSL в AlphaTestEffect.fx.
См. Microsoft Docs и эти Образцы C++. Большинство структурных изменений, с которыми вы имеете дело, были справедливы и для Direct3D 10.