다음을 통해 공유


디버그 계층을 사용하여 앱 디버그

디버그 계층을 사용하여 앱이 오류 및 경고의 클린 있는지 확인하는 것이 좋습니다. 디버그 계층을 사용하면 Direct3D 코드를 작성할 수 있습니다. 또한 디버그 계층을 사용하여 소스에서 불확실한 렌더링 오류 또는 블랙 스크린의 원인을 즉시 확인할 수 있으므로 생산성이 개선될 수 있습니다. 디버그 레이어는 많은 문제에 대한 경고를 제공합니다. 예를 들어 디버그 계층은 다음 문제에 대한 경고를 제공합니다.

  • 텍스처를 설정하는 것을 잊었지만 픽셀 셰이더에서 읽습니다.
  • 출력 깊이이지만 깊이 스텐실 상태가 바인딩되지 않음
  • INVALIDARG로 텍스처 만들기 실패

여기서는 디버그 계층을 사용하도록 설정하는 방법과 디버그 계층 을 사용하여 방지할 수 있는 몇 가지 문제에 대해 설명합니다.

디버그 계층 사용

디버그 계층을 사용하도록 설정하려면 D3D11CreateDevice 함수를 호출하여 렌더링 디바이스를 만들 때 Flags 매개 변수에 D3D11_CREATE_DEVICE_DEBUG 플래그를 지정합니다. 이 예제 코드는 Microsoft Visual Studio 프로젝트가 디버그 빌드에 있을 때 디버그 계층을 사용하도록 설정하는 방법을 보여 줍니다.

        UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
#if defined(_DEBUG)
        // If the project is in a debug build, enable the debug layer.
        creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
        // Define the ordering of feature levels that Direct3D attempts to create.
        D3D_FEATURE_LEVEL featureLevels[] =
        {
            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_1
        };

        ComPtr<ID3D11Device> d3dDevice;
        ComPtr<ID3D11DeviceContext> d3dDeviceContext;
        DX::ThrowIfFailed(
            D3D11CreateDevice(
                nullptr,                    // specify nullptr to use the default adapter
                D3D_DRIVER_TYPE_HARDWARE,
                nullptr,                    // specify nullptr because D3D_DRIVER_TYPE_HARDWARE 
                                            // indicates that this function uses hardware
                creationFlags,              // optionally set debug and Direct2D compatibility flags
                featureLevels,
                ARRAYSIZE(featureLevels),
                D3D11_SDK_VERSION,          // always set this to D3D11_SDK_VERSION
                &d3dDevice,
                nullptr,
                &d3dDeviceContext
                )
            );

디버그 계층을 사용하여 앱에서 오류 방지

Direct3D 11 API를 오용하거나 잘못된 매개 변수를 전달하는 경우 디버그 계층의 디버그 출력은 오류 또는 경고를 보고합니다. 그런 다음 실수를 수정할 수 있습니다. 다음으로, 정의되지 않은 동작 또는 운영 체제 작동이 중단될 수 있는 몇 가지 코딩 문제를 살펴보겠습니다. 디버그 계층을 사용하여 이러한 문제를 catch하고 방지할 수 있습니다.

NULL 포인터를 맵에 전달하지 않음

ID3D11DeviceContext::Map 메서드의 pResource 또는 pMappedResource 매개 변수에 NULL을 전달하면 Map의 동작이 정의되지 않습니다. 핵심 계층만 지원하는 디바이스를 만든 경우 Map에 대한 잘못된 매개 변수가 운영 체제에 충돌할 수 있습니다. 디버그 계층을 지원하는 디바이스를 만든 경우 디버그 출력은 이 잘못된 호출에 대한 오류를 보고합니다.

원본 및 대상 리소스 내에서 원본 상자 제한

ID3D11DeviceContext::CopySubresourceRegion 메서드를 호출할 때 원본 상자는 원본 리소스 내에 있어야 합니다. 대상 오프셋(x, y 및 z)을 사용하면 대상 리소스에 쓸 때 원본 상자를 오프셋할 수 있지만 원본 상자와 오프셋의 크기는 리소스 크기 내에 있어야 합니다. 대상 리소스 외부에서 복사하거나 원본 리소스보다 큰 원본 상자를 지정하려고 하면 CopySubresourceRegion 의 동작이 정의되지 않습니다. 디버그 계층을 지원하는 디바이스를 만든 경우 디버그 출력은 이 잘못된 CopySubresourceRegion 호출에 대한 오류를 보고합니다. CopySubresourceRegion에 대한 매개 변수가 잘못되면 정의되지 않은 동작이 발생하며 렌더링, 클리핑, 복사 없음 또는 렌더링 디바이스 제거가 발생할 수 있습니다.

DiscardResource 또는 DiscardView를 삭제하지 마세요.

런타임은 리소스를 올바르게 만들지 않는 한 ID3D11DeviceContext1::D iscardResource 또는 ID3D11DeviceContext1::D iscardView 에 대한 호출을 삭제합니다.

ID3D11DeviceContext1::D iscardResource에 전달하는 리소스는 D3D11_USAGE_DEFAULT 또는 D3D11_USAGE_DYNAMIC 사용하여 만들어졌어야 합니다. 그렇지 않으면 런타임이 DiscardResource 호출을 삭제합니다.

ID3D11DeviceContext1::D iscardView에 전달하는 뷰의 기반이 되는 리소스는 D3D11_USAGE_DEFAULT 또는 D3D11_USAGE_DYNAMIC 사용하여 만들어졌어야 합니다. 그렇지 않으면 런타임이 DiscardView에 대한 호출을 삭제합니다.

디버그 계층을 지원하는 디바이스를 만든 경우 디버그 출력은 삭제된 호출과 관련된 오류를 보고합니다.

소프트웨어 계층