DirectX 11向后兼容

时间:2014-09-24 13:57:40

标签: c++ directx directx-11

我正在通过以下here中的代码示例来学习DirectX。我在Code Set 1,第6章Box代码示例中。当我尝试在DirectX 11兼容机器中编译第6章的代码时,它运行正常,但当我在带有着色器5.0的DirectX 11机器中的directX 10的FEATURE LEVEL中运行该代码时

    //d3App.cpp.
    //In InitDirect3D() method

    D3D_FEATURE_LEVEL a[]={D3D_FEATURE_LEVEL_10_0};
    HRESULT hr = D3D11CreateDevice(
            0,                 // default adapter
            md3dDriverType,
            0,                 // no software device
            createDeviceFlags, 
    a, 1,              // default feature level array
            D3D11_SDK_VERSION,
            &md3dDevice,
            &featureLevel,
            &md3dImmediateContext);

     if( FAILED(hr) )
    {
        MessageBox(0, L"D3D11CreateDevice Failed.", 0, 0);
        return false;
    }

    //if( featureLevel != D3D_FEATURE_LEVEL_11_0 )
    //{
    //  MessageBox(0, L"Direct3D Feature Level 11 unsupported.", 0, 0);
    //  return false;
    //}

然后在box.cpp

    //Box.cpp       
    //In BuildFX() method

    HRESULT hr = D3DX11CompileFromFile(L"FX/color.fx", 0, 0, 0, "fx_5_0", shaderFlags, 
            0, 0, &compiledShader, &compilationMsgs, 0);

错误
    //Box.cpp. Line 172
    HR(mSwapChain->Present(0, 0));

如果我使用fx_4_0 DirectX 10将着色器更改为feature level,则在DirectX 11和DirectX 10计算机上的swap chain creation处都会失败。

此外,在DirectX 10机器中,如果我使用着色器fx_5_0在DirectX 10功能级别运行它,它不会发出错误但它也没有做任何事情。

是否可以使用与仅支持较低版本DirectX的机器兼容的DirectX 11 API构建应用程序?如果儿子,directX会自动处理它还是我们必须自己做?

1 个答案:

答案 0 :(得分:2)

您可能知道,只有D3D_FEATURE_LEVEL_11_0及更高版本支持着色器模型5。所以你会期望使用着色器fx_5_0降低到DX 10将无法​​正常工作。但是,使用DX 11构建应用程序,但支持较低版本是非常常见的。

包括您希望支持的每个版本。

static const D3D_FEATURE_LEVEL levels[] = {
    D3D_FEATURE_LEVEL_11_1,
    D3D_FEATURE_LEVEL_11_0,  
    D3D_FEATURE_LEVEL_10_1,
    D3D_FEATURE_LEVEL_10_0,
    D3D_FEATURE_LEVEL_9_3,
    D3D_FEATURE_LEVEL_9_2,
    D3D_FEATURE_LEVEL_9_1
}; 

注意:当前必须明确设置D3D_FEATURE_LEVEL_11_1(如果需要,尝试在没有DX 11_1的计算机上使用该功能将因E_INVALIDARG而失败。

在使用调试信息进行编译时,包含调试标志非常重要。通过简单地检查输出窗口来确定发生的事情将是一个巨大的帮助。在那里发送了大量警告和特定错误信息。

unsigned flags = [YOUR FLAGS]; 

#ifdef _DEBUG
flags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

另外,作为旁注,您可能需要考虑使用Windows运行时ComPtr<>。随着您的项目变得更加复杂,ComPtr<>将有效和妥善处理资源。

Microsoft::WRL::ComPtr<ID3D11Device> d3dDevice = nullptr;
Microsoft::WRL::ComPtr<ID3D11DeviceContext> deviceContext = nullptr;
D3D_FEATURE_LEVEL selectedFeatureLevel;

HRESULT hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, flags, 
                               levels, ARRAYSIZE(levels), D3D11_SDK_VERSION,
                               d3dDevice.GetAddressOf(), &selectedFeatureLevel,
                               deviceContext.GetAddressOf()));

但是,由于着色器模型5仅受D3D_FEATURE_LEVEL_11_0及更高版本支持,因此请确保正确的文件格式。

编辑: 另请注意,自上面引用的书籍发布以来,最近的D3D开发中已经发生了相当大的变化。例如&#39; D3DX11CreateTextureFromFile&#39;已弃用,并且有可用于迁移XNA代码的主题。

我希望这会有所帮助。