2014-09-24 5 views
0

here의 코드 예제를 통해 DirectX를 배우고 있습니다. 저는 코드 세트 1, 6 장 상자 코드 예제에 있습니다. I의 DirectX 11 호환 기계를 6 장의 코드를 컴파일 할 때, 그것을 잘 실행하지만 box.cppDirectX 11 역 호환성

5.0

//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; 
    //} 

그리고 쉐이더와 다이렉트 X 11 머신에 다이렉트 X 10의 FEATURE LEVEL에 그 코드를 실행하면 나는 다이렉트 X 10의 feature levelfx_4_0에 쉐이더를 변경 한 경우

//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)); 

에서 오류를했다, 그것은 0,123,006,985에 실패 DirectX 11 및 DirectX 10 모두에서입니다.

또한 DirectX 10 시스템에서 셰이더 fx_5_0이있는 DirectX 10 기능 수준에서 실행하면 오류가 발생하지 않지만 아무 것도 수행하지 않습니다.

더 낮은 버전의 DirectX를 지원하는 컴퓨터와 호환되는 DirectX 11 API를 사용하여 응용 프로그램을 빌드 할 수 있습니까? 아들 인 경우 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 <>이 자원을 효율적이고 적절하게 처리 할 수 ​​있습니다. 쉐이더 모델 5 만 D3D_FEATURE_LEVEL_11_0에 의해 최대 지원되기 때문에

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())); 

그러나, 적절한 파일 형식을 확인합니다.

EDIT : 위에서 언급 한 책이 게시 된 이후 최근 D3D 개발에서 상당한 금액이 변경되었습니다. 예를 들어 'D3DX11CreateTextureFromFile'은 더 이상 사용되지 않으며 XNA 코드를 마이그레이션하는 데 사용할 수있는 주제가 있습니다.

이 정보가 도움이되기를 바랍니다.

+1

Direct3D 11에 대한 레거시 D3DX 기능의 전체 목록은 [여기] (http://blogs.msdn.com/b/chuckw/archive/2013/08/21/living-without-d3dx)에서 확인할 수 있습니다. aspx). –

+1

[Direct3D 11의 장치 분석] (http://blogs.msdn.com/b/chuckw/archive/2014/02/05/anatomy-of-direct3d-11-create-device)도 참조하십시오.aspx) 및 [Direct3D 기능 수준] (http://blogs.msdn.com/b/chuckw/archive/2012/06/20/direct3d-feature-levels.aspx) –

+0

@ChuckWalbourn Outstanding. 메모 주셔서 감사. – Jeff