공부중

[DirectX12]Hello Wolrd Sample - D3D12HelloWindow - 1 본문

Programing/DirectX

[DirectX12]Hello Wolrd Sample - D3D12HelloWindow - 1

곤란 2018. 4. 7. 21:07
반응형

본 코드는 모두 Microsoft의 DirectX-Graphics-Samples의 'Hello Wolrd Sample'를 분석? 번역? 암튼 공부해보려고 작성하는 문서입니다.

제 정리가 답이고 정의고 올바른것이고 진리이다 라고 읽지 마시고 틀린거 있으면좀 알려주세요. ㅠㅠ

 

코드는 모두 https://github.com/Microsoft/DirectX-Graphics-Samples 에서 다운로드가 가능합니다.

 

정리하는 모든 프로젝트들은 UWP가 아니고 Desktop 튜토리얼이다.

 

ProjectName : D3D12HelloWindow

ProjectFile : 하단 참조.

 

윈도우를 띄우고 D3D12를 Init까지 해보는 튜토리얼이다.

 

처음인만큼 코드가 굴러가는 순서대로 일단 정리해볼 예정.

 

//*********************************************************
//
//FileName : Main.cpp
//
//*********************************************************
#include "stdafx.h"
#include "D3D12HelloWindow.h"

_Use_decl_annotations_
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
	D3D12HelloWindow sample(1280, 720, L"D3D12 Hello Window");
	return Win32Application::Run(&sample, hInstance, nCmdShow);
}

 

짧은 Main문을 보여주고 있다.

간단하게 D3D12HelloWindow class의 sample 객체를 생성해서 생성자에서 Init이 다 돌아가는것으로 보이고

Run돌리고 끝으로 추측....

 

D3D12HelloWindow class는 하단의 다이어그램과 같다

 

일단 D3DHelloWindow의 생성자부터 알아보자.

D3D12HelloWindow::D3D12HelloWindow(UINT width, UINT height, std::wstring name) :
	DXSample(width, height, name),
	m_frameIndex(0),
	m_rtvDescriptorSize(0)
{
}

해상도의 가로 세로와 이름을 전달받고 DXSample생성자로 그대로 넘겨버린다.

멤버변수인 m_frameIndex 와 m_rtvDescriptorSize는 동기화 객체(Synchronization objects)에 필요한 변수들이고 모두 0으로 초기화.

동기화 객체는 일단 넘어가고 DXSample의 생성자를 살펴보자.

DXSample::DXSample(UINT width, UINT height, std::wstring name) :
	m_width(width),
	m_height(height),
	m_title(name),
	m_useWarpDevice(false)
{
	WCHAR assetsPath[512];
	GetAssetsPath(assetsPath, _countof(assetsPath));
	m_assetsPath = assetsPath;

	m_aspectRatio = static_cast(width) / static_cast(height);
}

전달받은 너비 높이 이름을 초기화 해주고 

m_useWarpDevice멤버를 false로 해주었는데 m_useWarpDevice는 D3D 초기화를 할때

'하드웨어 그래픽 기능성을 흉내내는 소프트웨어 디스플레이어댑터'로 사용할것인지를 정해줄 flag이다.

결론은 d3d12를 지원하지 않는 하드웨어에서 개발 및 런타임(물론 엄청 느리다)을 사용하고자 할때 true로 해주면 될 것 같다.

 

생성자에서 WCHAR로 에셋경로를 저장할 변수를 지정해주고 GetAssetPath를 호출하는데.

GetAssetPath는 같은 프로젝트 내의 DXSampleHelper.h에 선언되어 있는 사용자 정의 함수이다.

내부를 간단하게 살펴보면

 

GetModuleFileName라는 매크로 함수를 호출하는데 이 매크로 함수는 WindowsKit에 포함된 매크로 함수이다. ( libloaderapi.h )

GetModuleFileName의 리턴값은 경로의 길이.

경로저장시 발생하는 예외상황은 여기서 설명하지 않을것.(오버플로우발생이나 경로길이가 없는경우 등등)

 

경로를 받아와 멤버변수로 저장을 하고.

가로 세로의 값으로 비율을 계산해 저장하고 있다. (가로 / 세로)

 

생성자에 따로 윈도우 생성 및 d3d생성은 없으니 Run으로 넘어가보자.

 

다음글로!

 

 

 

 

반응형