문제 해결(Direct3D 9)

이 항목에서는 Direct3D 애플리케이션을 작성할 때 발생할 수 있는 일반적인 문제 범주와 이를 방지하는 방법을 나열합니다.

디바이스 만들기

디바이스를 만드는 동안 애플리케이션이 실패하면 다음과 같은 일반적인 오류를 검사.

  • 디바이스 기능, 특히 렌더링 깊이를 검사 있는지 확인합니다.
  • 오류 코드를 검사합니다. D3DERR_OUTOFVIDEOMEMORY 항상 가능합니다.
  • 디버그 DirectX DLL(동적 연결 라이브러리)을 사용하고 디버거에서 출력 메시지를 검토합니다.

조명 꼭짓점 사용

조명 꼭짓점을 사용하는 애플리케이션은 D3DRS_LIGHTING 렌더링 상태를 FALSE로 설정하여 Direct3D 조명 엔진을 사용하지 않도록 설정해야 합니다. 기본적으로 조명을 사용하도록 설정하면 입력 꼭짓점이 0이 아닌 색 값이 포함된 경우에도 시스템은 일반 벡터를 포함하지 않는 꼭짓점의 색을 0(검은색)으로 설정합니다. 조명 꼭짓점은 기본적으로 꼭짓점 법선이 포함되지 않기 때문에 조명 엔진이 사용하도록 설정된 경우 렌더링 중에 Direct3D로 전달되는 모든 색 정보가 손실됩니다.

꼭짓점 색은 자체 조명을 수행하는 모든 애플리케이션에 중요합니다. 시스템에서 기본값을 부과하지 않도록 하려면 D3DRS_LIGHTING FALSE로 설정해야 합니다.

애플리케이션이 실행되지만 아무것도 표시되지 않는 경우 다음과 같은 일반적인 오류에 대해 검사.

  • 삼각형이 생성되지 않는지 확인합니다.
  • 삼각형이 컬링되지 않는지 확인합니다.
  • 변환이 내부적으로 일관된지 확인합니다.
  • 뷰포트 설정을 확인하여 삼각형을 볼 수 있는지 확인합니다.

디버깅

Direct3D 애플리케이션 디버깅은 어려울 수 있습니다. 매우 다른 하드웨어 구현에 종속된 Direct3D 프로그래밍에서 특히 중요한 조언인 모든 반환 값을 확인하는 것 외에도 다음 기술을 사용해 보세요.

  • DLL 디버그로 전환합니다.
  • 소프트웨어 전용 디바이스를 강제로 적용하여 사용 가능한 경우에도 하드웨어 가속을 끕니다.
  • 시스템 메모리에 표면을 강제로 넣습니다.
  • 통합 디버거를 사용할 수 있도록 창에서 실행하는 옵션을 만듭니다.

이 목록의 두 번째 및 세 번째 옵션은 디버거가 중단될 수 있는 Win16 잠금을 방지하는 데 도움이 될 수 있습니다.

또한 Win.ini 다음 항목을 추가해 보세요.

[Direct3D] 
debug=3 
[DirectDraw] 
debug=3 

Borland Floating-Point 초기화

Borland의 컴파일러가 Direct3D와 호환되지 않는 방식으로 부동 소수점 예외를 보고합니다. 이 문제를 해결하려면 다음과 같은 _matherr 예외 처리기를 포함합니다.

// Borland floating point initialization 
#include <math.h>
#include <float.h>

void initfp(void)
{
    // Disable floating point exceptions
    _control87(MCW_EM,MCW_EM);
}

int _matherr(struct _exception  *e)
{
    e;               // Dummy reference to catch the warning
    return 1;        // Error has been handled
}

매개 변수 유효성 검사

성능상의 이유로 Direct3D 직접 실행 모드 런타임의 디버그 버전은 소매 버전보다 더 많은 매개 변수 유효성 검사를 수행하며, 경우에 따라 유효성 검사를 전혀 수행하지 않습니다. 이를 통해 애플리케이션은 성능 튜닝 및 최종 릴리스에 더 빠른 소매 버전을 사용하기 전에 느린 디버그 런타임 구성 요소로 강력한 디버깅을 수행할 수 있습니다.

여러 Direct3D 직접 실행 모드 메서드는 허용할 수 있는 값에 제한을 적용하지만 이러한 제한은 종종 Direct3D 직접 실행 모드 런타임의 디버그 버전에서만 검사되고 적용됩니다. 애플리케이션은 이러한 제한을 준수해야 하며, Direct3D의 소매 버전에서 실행할 때 예측할 수 없고 바람직하지 않은 결과가 발생할 수 있습니다. 예를 들어 IDirect3DDevice9::D rawPrimitive 메서드는 메서드가 렌더링할 기본 형식의 수를 나타내는 매개 변수(PrimitiveCount)를 허용합니다. 메서드는 0에서 D3DMAXNUMPRIMITIVES 사이의 값만 허용할 수 있습니다. Direct3D의 디버그 버전에서 D3DMAXNUMPRIMITIVES 기본 형식을 초과하면 메서드가 정상적으로 실패하여 오류 메시지를 오류 로그에 인쇄하고 오류 값을 애플리케이션에 반환합니다. 반대로 애플리케이션이 런타임의 정품 버전으로 실행 중일 때 동일한 오류를 발생하면 동작이 정의되지 않습니다. 성능상의 이유로 메서드는 매개 변수의 유효성을 검사하지 않으므로 매개 변수가 유효하지 않을 때 예측할 수 없고 완전히 상황적인 동작이 발생합니다. 경우에 따라 호출이 작동할 수 있으며, 다른 경우에는 Direct3D에서 메모리 오류가 발생할 수 있습니다. 잘못된 호출이 특정 하드웨어 구성 및 DirectX 버전에서 일관되게 작동하는 경우 다른 하드웨어 또는 이후 버전의 DirectX에서 계속 작동한다는 보장은 없습니다.

정품 Direct3D 런타임 파일을 사용하여 실행할 때 애플리케이션에 설명할 수 없는 오류가 발생하는 경우 디버그 버전에 대해 테스트하고 애플리케이션이 잘못된 매개 변수를 전달하는 경우를 자세히 살펴봅니다. DirectX 제어판 애플릿을 사용하고, 필요한 경우 디버그 런타임으로 전환하고, "D3DError에서 중단" 옵션을 검사. 이 옵션은 애플리케이션 버그가 감지될 때 애플리케이션을 강제로 중지하기 위해 런타임에서 Windows DebugBreak 메서드를 사용하도록 강제합니다.

프로그래밍 팁