Direct3D 응용 프로그램의 디버깅

2022. 9. 25. 23:17Public/GraphicsAPI

응용 프로그램 프레임워크는 다수의 Direct3D 함수들이 돌려주는 HRESULT 형식의 반환값을 점검해 주는 매크로를 제공한다. 그매크로는 d3dUtil.h에 다음과 같이 정의되어 있다.

 

#if defined(DEBUG) | defined(_DEBUG)
	#ifndef HR
	#define HR(x)                                              \
	{                                                          \
		HRESULT hr = (x);                                      \
		if(FAILED(hr))                                         \
		{                                                      \
			DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true); \
		}                                                      \
	}
	#endif

#else
	#ifndef HR
	#define HR(x) (x)
	#endif
#endif

 

이 매크로는 함수의 반환 코드가 실패에 해당하는 값이면 그 반환 코드를 DXTrace 함수 (#include <dxerr.h> 및 dxerr.lib 링크가 필요함)에 넘겨준다.

HRESULT WINAPI DXTraceW( __in_z const char* strFile, __in DWORD dwLine, __in HRESULT hr, __in_z_opt const WCHAR* strMsg, __in BOOL bPopMsgBox );

 

이 함수는 오류가 발생한 파일과 행번호를 보여 주는 깔끔한 메시지 상자를 띄운다. 그 메시지 상자는 발생한 오류를 설명하는 메시지와 오류가 발생한 함수의 이름도 보여 준다. 

DXTrace 함수의 마지막 매개변수(BOOL bPopMsgBox)를 false로 하면 메시지 상자가 뜨는 대신 메시지 정보가 Visual C++ 출력 창에 출력된다

그리고 디버그 모드가 아닌 경우에는 이 HR 매크로가 아무일도 일어나지 않는다.

그리고 이러한 HR을 함수가 아니라 반드시 매크로로 정의해야 한다는 점도 중요하다. 함수로 정의하면 __FILE__과 __LINE__은 항상 그 함수가 구현된 파일과 행번호를 가리킬 뿐이다. 매크로로 만들어야 HR이 실제로 쓰인 코드의 파일과 행번호가 된다.

 

다음은 이 매크로를 사용하는 방법이다. 

HRSULT를 돌려주는 Direct3D의 호출을 다음과 같이 해당 매크로로 감싸면 된다.

HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice,L"grass.dds",0,0,&mGrassTexRV,0));

 

 

참고서적 : http://www.yes24.com/Product/Goods/11129592

'Public > GraphicsAPI' 카테고리의 다른 글

[DX12]혼합(Blend) 및 예제  (0) 2023.08.26
Direct3D 첫번째 요약  (0) 2022.09.25
Direct3D 초기화 예제  (0) 2022.09.25
DX11 Tutorial02 코드 설명  (0) 2022.08.22
광원  (0) 2022.08.15