目前,我正在将旧代码从 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
函数是自写的,确定纹理和alpha的位置。
问题在于新版本的 DirectX 11 中没有这些参数:
AlphaBlendEnable = true;
SrcBlend = SrcAlpha;
DestBlend = One;
ZFunc = LESSEQUAL;
AlphaTestEnable = true;
AlphaRef = 1;
AlphaFunc = GreaterEqual;
我发现可以使用
SetBlendState
功能设置以下参数:
DirectX9:
AlphaBlendEnable = true;
SrcBlend = SrcAlpha;
DestBlend = InvSrcAlpha;
DirectX11:
BlendState BSAlphaBlending
{
BlendEnable[0] = true;
SrcBlend = SRC_ALPHA;
DestBlend = INV_SRC_ALPHA;
};
SetBlendState( BSAlphaBlending, float4( 0, 0, 0, 0 ), 0xffffffff );
对于
DestBlend = One
时的情况:
DirectX9:
AlphaBlendEnable = true;
SrcBlend = SrcAlpha;
DestBlend = One;
DirectX11:
BlendState BSSrcAlphaDestOne
{
BlendEnable[0] = true;
SrcBlend = SRC_ALPHA;
DestBlend = ONE;
};
SetBlendState( BSSrcAlphaDestOne, float4( 0, 0, 0, 0 ), 0xffffffff );
但是我还没有弄清楚如何将其余参数移植到DirectX11,例如:
DirectX9:
ZFunc = LESSEQUAL;
AlphaTestEnable = true;
AlphaRef = 1;
AlphaFunc = GreaterEqual;
在版本 9 中,它们有一个
D3DRENDERSTATETYPE
枚举,并且可以使用 SetRenderState
函数指定必要的参数,但是版本 11 中此函数的类似物是什么?
首先,您使用的是旧版效果 (FX) 系统,因此请务必查看 GitHub 了解最新版本和限制。
对于 Direct3D 11,您需要计算出状态组合排列并为它们创建状态对象(您有 5 个对象需要设置,而不是一百个小的单独开关)。例如,ZFunc 是 DepthStencilState 对象的一部分。
请参阅 Microsoft Docs 和这些 C++ 示例。您所处理的大多数结构更改也适用于 Direct3D 10。