Post Lists

2019년 1월 12일 토요일

DirectX Tutorial Lesson 2 : Initializing Direct3D

http://www.directxtutorial.com/Lesson.aspx?lessonid=11-4-2

Lesson Overview
너가 Direct3D를 작동시키는 개념을 공부했으니, 간단한 Direct3D 프로그램을 구성하여 실제적인 것으로 들어가보자. 이 프로그램에서, 우리는 Direct3D를 초기화하고 그것을 다시 닫을 것이다. 그것은 많은 것은 아니고, 심지어 "Hello World"도 아니지만, 그것은 좋은 싲가이다.

COM
그래서 COM이 무엇이냐?

COM은 Component Object Model을 나타낸다. COM은 실제로 레고같이 행동하는 매우 고급 오브젝트들을 만드는 한 방법이다.

너도 알 듯이, 레고는 좀 더 고급 모양을 만들기 위해 함께 뭉쳐진다. 어떠한 단일 Lego도 실제로 세트에서 다른 레고를 신경쓰지 않는다. 그것들은 서로 호환가능하고, 너가 해야할것은 그것들이 작동하도록 서로 붙이는 것이다. 만약 너가 조각들을 바꾸고 싶다면, 너가 해야할 것은 한 조각을 빼서 다른 것을 그것의 자리에 넣는 것이다.

그것이 COM이 하는 것이다. COM objects는 실제로 C++ 클래스이거나 클래스들의 그룹인데, 거기에서 너는 함수를 호출할 수 있고, 어떤 목표를 달성할 수 있다. 어떠한 class도 작동하기 위해 다른 것을 요구하지 않고, 그래서 그것들은 어떤 일을 처리하기 위해 함께 작업할 필요가 없다. 그러나 너는 그것들을 너의 바람대로 그 프로그램의 나머지를 바꾸지 않고 plug or unplug할 수 있다.

예를들어, 가령 너가 광범위하게 배포된 한 게임을 가졌다고 하자. 그리고 너는 그것을 업그레이드 하고 싶다. 너의 게임을 구매한 모든 단일 사용자에게 새로운 copy를 추적하여 배송하는 대신에, 너가 해야할 것은 "Upgrade! Right Here!"이라고 말하느 ㄴ것이ㅏㄷ. 그들은 업데이트된 COM object를 다운 받고, 그리고 그 새로운 object는 너의 프로그램에 문제 없이 plugs in 들어간다. 좋지 않는가?

나는 COM에 상세히 들어가지 않을 것이다. 왜냐하면 우리가 필요한 것에 대해 너무 복잡하기 때문이다. ~~~~

그래서 왜 COM이냐? DirectX는 실제로 COM objects의 연속이고, 그것들 중 하나는 Direct3D이다. Direct3D는 그것 내부에 다른 COM object를 갖고있는 COM object이다. 궁극적으로, 그것은 소프트웨어, 하드웨어 또는 무슨 웨어든지 사용하여 2D와 3D 그래픽스를 작동시키게 하는데 필요한 모든 것을 포함한다.

그래서 Direct3D는 클래스들에 이미 저장되어 있기 때문에, Direct3D 함수들이 이렇게 호출되는 것을 보았을 때 놀라지 마라:

우리는 함수들 CreateRenderTargetView()와 Release()를 Direct3D class로부터 접근하기 위해 indriect member access operator를 사용한다. 우리는 우리가 그것이 실제로 어떻게 적용되는지를 볼 때 이것에 더욱 알아볼 것이다. 나는 여기에서 필요하지 않ㅇ는 이론을 피하려고 할 것이다.

비록 COM의 일이 모든 복잡성을 숨기는 것일지라도, 너가 그것에 대해 알아야 할 네 가지가 있다.

1. COM object는 interface에 의해 통제되는 한 클래스 이거나 클래스들의 집합이다. interface는 함수들의 한 집합인데, COM object를 통제한다. 위의 예제에서, "device"는 COM object이고, 그 함수들은 그것을 통제한다.

2. COM object의 각 type은 unique ID를 갖는다. 예를들어, 그 Direct3D object는 그것 자신의 ID를 갖고, 그 DirectSound object는 그것 자신의 ID를 갖는다. 가끔씩 너는 이 ID를 코드에서 상요할 필요가 있다.

3. COM object를 사용할 때, 너는 항상 Release()함수를 호출해야만 한다. 이것은 그 object가 그것의 메모리를 해제하고 그것의 쓰레드를 종료하라고 말할 것이다.

4. COM objects는 인식하기에 쉽다. 왜냐하면 그것들은 일반적으로 "I"와 시작하기 때문이다. 'ID3D10Device' 처럼.

이러한 4개의 세부사항에 걱정하지 말아라. 우리는 그것들이 어떻게 적용되는지를 볼 ㅓㄳ이다. 이제 실제 코드에 들어가보자:

Direct3D Headers
우리가 실제 Direct3D 코드에 들어가기전에, 헤더 파일, 라이브러리 파일, 그리고 다른 재미있는 것들에 말해보자. 우리의 데모 프로그램에서, 우리는 꼭대기에 이러한 것들을 가질 것이고, 이것은 우리에게 Direct3D에 대한 global access를 준다.

이러한 것들을 보고 그것들이 무엇인지 보자.

~~~
ID3D11Device* dev;

이 변수는 device에 대한 변수이다. Direct3D에서, 한 device는 너의 video adapter의 virtual representation이 되려고 하는 한 오브젝트이다. 이 코드 라인이 의미하는 것은 우리가 ID3D11Device라고 불려지는 COMobject를 만들 거라는 것이다. COM이 이 오브젝트를 만들 때, 우리는 그것을 무시할 것이고, 그것에 이 포인터를 간접적으로 사용하여 접근할 것이다. 우리는 이것이 어떻게 발생하는지 볼 것이다.

ID3D11DeviceContext* devcon;

device context는 device와 유사하지만, 그것은 GPU와 렌더링 파이프라인을 관리하는데 책임이 있다 (그 device는 대개 video memory를 관리한다). 이 오브젝트는 그래픽스를 렌더링하고, 그것들이 어떻게 렌더링될지를 결정하는데 사용된다.

IDXGISwapChain* swapchain;
우리가 지난 강의에서 다루었듯이, 그 swap chain은 차례대로 렌더링될 버퍼들의 연속이다. 이 변수는 그러한 chain에 대한 포인터이다.

이 오브젝트가 Direct3D에 속하지 않는다는 것을 유의해라. 그러나 그것은 실제로 DXGI의 일부이고, 그것은 Direct3D 아래에 있다.

Launching Direct3D
Direct3D를 실제로 코딩하는 첫 번째 단계는 위의 세 개의 COM objects들을 생성하고 그것들을 초기화하는 것이다. 이것은 단일의 함수와 graphics device information을 포함하는 구조체를 사용하여 처리 된다. 이 함수를 여기에서 봐보자. 그러고나서 그것의 부분들을 보자. 나는 새로운 부분을 bold하려고 하지 않았다. 왜냐하면 전체가 새롭기 때문이다.

만약 그 코드의 주석이 너에게 충분하다면, 훌륭한다. 그렇지 않다면, 나는 이러한 명령어들 각각을 아래에서 설명했다.





























댓글 없음:

댓글 쓰기