2014-09-24 84 views
0

我通過以下代碼示例從here瞭解DirectX。我在代碼集1,第6章框代碼示例。當我嘗試編譯第6章的代碼在DirectX 11兼容的機器,它運行良好,但是當我在DirectX 11的機器上運行的代碼在DirectX 10的FEATURE LEVEL的Shader 5.0DirectX 11向後兼容

//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機器中均使用。此外,在DirectX 10機器中,如果我使用着色器fx_5_0在DirectX 10功能級別上運行它,它不會給出錯誤,但它也不會執行任何操作。

是否可以使用DirectX 11 API來構建應用程序,該應用程序與僅支持較低版本DirectX的機器兼容?如果兒子,directX自動處理它,還是我們必須自己做?

回答

2

如您所知,着色器模型5僅受D3D_FEATURE_LEVEL_11_0及以上版本支持。所以你會期望用着色器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的最新發展已經發生了相當的變化。例如'D3DX11CreateTextureFromFile'已被棄用,並有可用於遷移XNA代碼的主題。

我希望這會有所幫助。

+1

Direct3D 11的傳統D3DX功能替換完整列表可以在這裏找到(http://blogs.msdn.com/b/chuckw/archive/2013/08/21/living-without-d3dx。 ASPX)。 – 2014-09-27 18:24:30

+1

另請參見[Direct3D 11創建設備剖析](http://blogs.msdn.com/b/chuckw/archive/2014/02/05/anatomy-of-direct3d-11-create-device。aspx)和[Direct3D Feature Levels](http://blogs.msdn.com/b/chuckw/archive/2012/06/20/direct3d-feature-levels.aspx) – 2014-09-27 18:25:49

+0

@ChuckWalbourn傑出。謝謝你的提示。 – Jeff 2014-09-29 02:50:17