我正在使用DirectX 11 API开发延迟渲染器,并且需要改变渲染目标的混合状态。 DX10.0只允许一组混合操作:
typedef struct D3D10_BLEND_DESC {
BOOL AlphaToCoverageEnable;
BOOL BlendEnable[8];
D3D10_BLEND SrcBlend;
D3D10_BLEND DestBlend;
D3D10_BLEND_OP BlendOp;
D3D10_BLEND SrcBlendAlpha;
D3D10_BLEND DestBlendAlpha;
D3D10_BLEND_OP BlendOpAlpha;
UINT8 RenderTargetWriteMask[8];
} D3D10_BLEND_DESC;
而DX11 API可以灵活地指定8。
typedef struct D3D11_BLEND_DESC {
BOOL AlphaToCoverageEnable;
BOOL IndependentBlendEnable;
D3D11_RENDER_TARGET_BLEND_DESC RenderTarget[8];
} D3D11_BLEND_DESC;
typedef struct D3D11_RENDER_TARGET_BLEND_DESC {
BOOL BlendEnable;
D3D11_BLEND SrcBlend;
D3D11_BLEND DestBlend;
D3D11_BLEND_OP BlendOp;
D3D11_BLEND SrcBlendAlpha;
D3D11_BLEND DestBlendAlpha;
D3D11_BLEND_OP BlendOpAlpha;
UINT8 RenderTargetWriteMask;
} D3D11_RENDER_TARGET_BLEND_DESC;
现在在D3D_FEATURE_LEVEL_10_0使用我的DX11卡,我没有得到错误或警告创建和设置IndependentBlendEnable为true的状态。相信这个结果是否可以安全地代表DX10.0硬件会发生什么,或者仅仅是功能级别检查的大致指南?
答案 0 :(得分:0)
在DX10.0硬件上会失败。由于我的测试在RenderTarget []数组中没有变化,因此看起来DX检测到IndependentBlendEnable的值没有区别并忽略它。给出警告是有帮助的,但没有输出,导致我怀疑独立混合是在软件而不是硬件中解决的。无论如何,当改变RenderTarget []数据时,下面的错误会弹出,一切都有意义,尽管在这种情况下不方便。
D3D11 ERROR: ID3D11Device::CreateBlendState: SrcBlend[ 4 ] does not equal SrcBlend[ 0 ]
and D3D10.1 hardware is not supported. When GetFeatureLevel returns
D3D_FEATURE_LEVEL_10_0 or less, any enabled render target blending must use the same
blending configuration. [ STATE_CREATION ERROR #212: CREATEBLENDSTATE_INVALIDSRCBLEND]