Post Lists

2019년 1월 14일 월요일

DirectX Tutorial Lesson 3 : Rendering Frames

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

Lesson Overview
Direct3D가 초기화 되었다면, 몇 가지 실제 렌더링을 시작할 시간이다. 렌더링 그 자체로는 매우 쉽지만, 관련된 준비 작업들이 조금 있다. 이 강의에서, 우리는 blank frame을 렌더링하기 위한 모든 준비를 할 것이다.

그 관련된 설정은 간단하다. 되어야 할 두 가지 것들이 있다. 첫 번째, 울니느 GPU에게 메모리의 어디에서 최종 이미지를 만들지 말할 필요가 있다 (우리에게, 이것은 back buffer이다). 두 번째로, 우리는 GPU에게 back buffer 어디에서 그것이 그려야 하는지를 말할 필요가 있다.

그것만 된다면, 우리는 렌더링할 수 있다. 쉬운 것이다.

Setting the Render Target
어디에 렌더링할 지 부터 시작하자. 너는 논리적으로 이제 "back buffer"라고 말할 것이고 끝났다. 그러나, Direct3D는 실제로 이 지점에서 그것을 모른다. 너가 back buffer에 당장 렌더링하고 싶지 않는 것도 가능하다. 예를들어, 많은 게임들은 한 model의 surface에 렌더링하고, 그 model을 back buffer에 렌더링한다. 이 기법은 다양한 효과를 만들어 낼 수 있다. 만약 너가 Portal을 플레이 해봤다면, 너는 이것의 예를 보았을 것이다. Portal에서, 그 게임 엔진은 처음에 portal에 렌더링하고, 그러고나서 전체 scene을 포함된 portal image로 렌더링한다.

Direct3D에서 렌더링할 때, 너는 render target을 설정해야마 한다. 이것은 video memory에서 렌더링 할 위치를 유지하는 간단한 COM object이다. 대부분의 경우에 (우리의 경우를 포함해서) 이것은 back buffer이다.

여기에 그것을 어떻게 하는지가 있다:

그것은 복잡해 보이지만, 꽤 간단하다.

여기에서 해야 할 세 가지 것이 있따. 처음에, 우리는 back buffer의 주소를 결정한다. 두 번째, 우리는 render target을 나타내기 위해 그 주소를 사용하여 COM object를 생성한다. 세 번째, 우리는 그 오브젝트를 active render target으로 설정한다.

여기에 새로운 코드들이 있따. 그래서 그것이 무엇을 의미하는지 보자.

ID3D11RenderTargetView* backbuffer;

이 변수는 render target에 대한 모든 정보를 포함하는 한 오브젝트에 대한 포인터이다. 우리는 back buffer에 렌더링할 것이고, 그래서 우리는 이것을 'backbuffer'라고 부를 것이다.

ID3D11Texutre2D* pBackBuffer;

3D 렌더링에서, texture는 image의 또 다른 이름이다. ID3D11Texture2D는 flat image를 저장하는 한 오브젝트이다. 어느 COM object처럼, 우리는 처음에 그 포인터를 정의하고, 나중에 한 함수가 우리를 위해 그 오브젝트를 생성한다.

swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);

너가 믿을지 모르겠찌만, 이 명령어는 실제로 간단하다. 이 GetBuffer() 함수가 하는 것은 swap chain에서 back buffer를 찾고, pBackBuffer texture object를 생성하기 위해 그것을 사용한다.

첫 번째 파라미터는 얻어질 back buffer의 개수이다. 우리는 이 chain에서 하나의 back buffer만을 사용하고, 그것은 back buffer #0이다. 그러므로, 첫 번째 파라미터는 0이 될 것이다.

두 번째 파라미터는 ID3D11Texture2D COM object를 확인하는 숫자이다. COM object의 각 type은 그것 자신의 unique ID를 갖는데, 이것은 그것에 대한 정보를 얻기 위해 사용된다. 이 ID를 얻기 위해, 우리는 __uuidof 연산자를 사용한다. 이것에 어떻게 작동하는지에 대한 정확한 세부사항은 중요하지 않지만, 우리가 그것을 하는 이유는, GetBuffer() 함수가 오브젝트의 type이 무엇으로 만들어져야 하는지를 알아야 하기 때문이다.

세 번째 파라미터는 너에게 이해가 되지 않을 것이다. 만약 너가 적어도 C++ 중급자가 아니라면. 기본적으로 void*는 어떠한 특수한 변수 타입을 가리키지 않는 포인터이다. 예를들어, double* 은 double를 가리키고, 반면에 int* 는 int를 가리킨다. void*는 어떤 것을 가리키는데 상요되고, 그것은 어떤 다른 type의 포인터로 변환될 수 있다.

이 세 번째 파라미터에서, 우리는 void* 포인터를 갖는다. 이 void*는 ID3D11Texture2D object의 위치로 채워진다. 그것은 void*가 될 필요가 있는데, 왜냐하면, 우리가 요청할 다른 타입의 오브젝트들이 있기 때문이다.

이 특별한 함수는 너가 너무 많이 어지러워지지 않을 것이다. 그래서 의문에 있더라도 걱정하지 말라. 너는 Direct3D에 대해 배울 더 쉬운 시간을 얻게 될 것이다.

dev->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer);

이 함수는 render target object를 만든다. 우리는 그 프로그램의 맨 위에서 이 오브젝트에 대한 포인터를 만들었따.

그 첫 번째 파라미터는 텍스쳐에 대한 포인터이다. 그것은 윌의 프로그램에서 'pBackBuffer'
여야 한다.

두 번쨰 파라미터는 render target을 설명하는 구조체이다. 우리는 이것을 back buffer를 위해 채울 필요가 없다. 우리는 그것을 NULL로 설정할 것이다.

그 세 번째 파라미터는 object pointer의 주소이다. ~

~~

~~

devcon->ClearREnderTargetView()

이것은 render target buffer를 특정 color로 채운다. 윌의 경우에 우리의 back buffer에 채울 것이다. 그것은 꽤 간단하다. 두 개의 파라미터가 있다.

첫 번째 것은 render target object의 주소이다. ~

두 번째 파라미터는 너가 back buffer에 채우고 싶은 컬러이다. 이것을 하기 위해서, 우리는 D3DXCOLOR라고 불리는 간단한 구조체를 사용한다. 그 네 개의 생성자 파라미터들은 컬러를 채우기 위해 사용된다. ~~

swapchain->Present()
다음으로, 우리는 Present() 함수를 호출한다. 이 함수는 back buffer에 그려진 모든 것이 실제로 나타나는 곳이다. 그것의 일은 기본적으로 swap chain에 있는 "swap"을 수행하는 것이고, back buffer가 front buffer가 되게하기 위해서이다.

그 두 번째 파라미터는 둘다 0으로 설정되고, 이 튜토리얼에서 더 많이 사용되지 않으 것이다.

댓글 없음:

댓글 쓰기