2013年4月7日

解決DirectX 11 API無法使用Feature Level=11 的顯示卡

之前測試Direct X程式,DirctX 11 加強了DirectX 10,並帶來了Tessellation(拆嵌式細分曲面技術)、Multi-Threading(多執行緒)、DirectCompute(通用計算)、Shader Model 5.0(渲染引擎5.0)以及Texture Compression(紋理壓縮)五個重要特性。 
我們下載了DirectX 11 SDK,並使用VS 2010進行測試。  
測試的機器為NB有獨立顯卡Geforce GT 520 M是可以支援Level 11,以下程式建立D3D11 device,但只偵測出顯示卡的Feature Level為10.1,並導致後續的程式使用Shader Model 5.0(需顯卡支援Feature Level:11, 微軟參考)的功能而發生錯誤。直覺是程式用到 On board的Intel HD 3000。
發生錯誤程式:


 D3D_FEATURE_LEVEL featureLevel;
 HRESULT hr = D3D11CreateDevice(
   0,                 // default adapter
   md3dDriverType,
   0,                 // no software device
   createDeviceFlags, 
   0, 0,              // default feature level array
   D3D11_SDK_VERSION,
   &md3dDevice,
   &featureLevel,
   &md3dImmediateContext);

 if( FAILED(hr) )
 {
  MessageBox(0, L"D3D11CreateDevice Failed.", 0, 0);
  return false;
 }
 switch( featureLevel )
   {
   case D3D_FEATURE_LEVEL_11_0:
      MessageBox(0, L"Direct3D Feature Level 11 supported.", 0, 0);
      break;
   case D3D_FEATURE_LEVEL_10_1:
      MessageBox(0, L"Direct3D Feature Level 10.1 supported.", 0, 0);
      break;
   case D3D_FEATURE_LEVEL_10_0:
      MessageBox(0, L"Direct3D Feature Level 10.0 supported.", 0, 0);
      break;
   case D3D_FEATURE_LEVEL_9_3:
      MessageBox(0, L"Direct3D Feature Level 9.3 supported.", 0, 0);
      break;
   case D3D_FEATURE_LEVEL_9_2:
      MessageBox(0, L"Direct3D Feature Level 9.2 supported.", 0, 0);
      break;
   case D3D_FEATURE_LEVEL_9_1:
      MessageBox(0, L"Direct3D Feature Level 9.1 supported.", 0, 0);
      break;
   default:
      MessageBox(0, L"If you were a cow, this would be utter failure.", 0, 0);
      return false;
   }
 

原因

將我的NB的Nvidia管理介面叫出,因為筆電要省電所以委由nVidia 3D管理程式自動切換顯示卡,因為我們的程式是一般Direct X測試程式,所以Nvidia管理程式就會使用預設的Intel HD 3000,而HD 3000只支援Feature Level: 10.1


image

解決方式

有以下兩種解決方式:
  1. 將nVidia的3D設定,設為高效能NVIDA處理器,也就是獨立顯卡520M  
    image
     
  2. 在程式裡指定顯卡

  3. 修改後,再一次執行程式,就是我們要的11了


image


 

沒有留言:

張貼留言