D3D11_BLEND_DESC的IndependentBlendEnable在D3D_FEATURE_LEVEL_10_0中可以安全使用吗?

时间:2014-05-12 13:52:22

标签: directx

我正在使用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硬件会发生什么,或者仅仅是功能级别检查的大致指南?

1 个答案:

答案 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]