Post Lists

2019년 1월 8일 화요일

DirectX Tutorial Lesson 1: Understanding Graphics Concepts

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

Lesson Overview
우선, 나는 공식적으로 Direct3D에 온 너를 환영한다. 나는 너에게 3D 프로그래밍의 기본과 고급 주제들을 가르치고 싶다. 너가 너 자신의 엔진을 구성하길 원하던가, 빌리던가 수정하든, 또는 사서 그것을 사용한든, 너가 그것의 밑에 있는 개념을 이해하는 것은 중요하다.

게임엔진의 밑에 있는 개념들이 중요하듯이, Direct3D 그 자체 밑에 있는 개념들도 중요하다. 이 강의는 Direct3D의 기본을 다룰 것이고, 너가 알 필요가 있는 것은 너의 첫 번째 Direct3D Program을 시도하는 것이다.

이 첫 번째 강의는 이론 강의이다. 우리는 다음 강의에서 관련된 연습을 다룰 것이다.

Graphics Hardware
그래픽스 프로그래밍의 좋은 이해는 그래픽스와 연관된 하드웨어의 좋은 이해를 요구한다. Direct3D는 게임 플랫폼이라기 보다는, 하드웨어 인터페이스이다. 너가 Direct3D에서 하는 모든 것은 그래픽스 하드웨어 그 자체를 조작하기 위해서 처리된다. 그래픽스 하드웨어에 대한 이해없이, Direct3D는 거의 쓸모없다.

우리가 주로 그래픽스 프로그래밍과 관련있는 하드웨어는 GPU이다, 즉 Graphics Processing Unit. 이것은 CPU (central processing unit)과 몇 가지 구조적인 면에서 다르지만, 우선적으로 그것이 사용되는곳에서 다르다. CPU는 계산을 수행하고, 전체 컴퓨터를 지도한다. GPU는 그래픽스와 관련된 계산을 수행하고, 그래픽스 결과를 모니터에 옮긴다.

그것 자신의 별개의 프로세서를 갖는 것 외에도, 그래픽스 프로그래밍은 video memory라고 불려지는 완전히 고립된 메모리 부분으로 작업한다. 그것은 실제로 물리적으로 분리되어 있다. motherboard에 존재하는 대신에, video memory는 일반적으로 video card에 존재하고, 그래서 그것은 빠르게 GPU에 의해서 접근되어질 수 있다. 그 비디오 MEMORY는  스크린에 있는 현 재 이미지를 저장하기 위해서 사용되고, 뿐만 아니라 다음 이미지를 컴파일 하기 위해 상요될 어떤 데이터를 저장하기 위해 사용된다.

물리적 하드웨어가 더 나아가듯이, 그것이 우리가 걱정할 필요가 있는 모든 것이다. Direct3D는 대부분, 데이터가 system memory or video memory에 언제 저장될지를 관리할 것이고, 너는 그것에 대해 걱정할 필요가 없다.

DirectX Graphics Infrastructure
DirectX Graphics Infrastructure는 Direct3D의 가장 최근 버전의 기반에 놓여있는 컴포넌트이다. 그것의 일은 이미지를 스크린에 보이게하고, 그 모니터가 무슨 해상도이고, 무슨 video card를 다룰 수 있는지 같은 기본 일들을 다룬다.

DXGI는 실제로 Direct3D의 부분이 아니다. 그것은 다른 그래픽스 컴포넌트아래에 있고, 그것은 Direct3D와 harware 사이의 인터페이스로서 작동한다.

DXGI를 직접적으로 다루는 방법들이 있지만, 우리는 이것에 깊게 들어가지 않을 것이다. 중요한 것은 너가 이 컴포넌트가 존재한다는 것을 인지하는 것이다. DXGI를 독점적으로 다루는 Direct3D가 있기 때문이다.

The Swap Chain
GPU는 그것의 메모리에서 픽셀 버퍼에 대한 포인터를 포함한다. 그 버퍼는 현재 스크린에 보여지는 이미지를 포함한다. 너가 어떤 것을 렌더링할 필요가 있을 때, 3D model or image같은, 그 GPU는 이 배열을 업데이트하고, 그 정보를 전시할 모니터에 보낸다. 그 모니터는 그러고나서 그 스크린을 위에서부터 바닦까지 다시 그리고, 오래된 이미지를 새것으로 교체한다.

그러나, 이것에 문제가 있는데, 모니터가 real-time rendering에 필요한만큼 빠르게 refresh 하지 않는다는점에서 그렇다.  대부분의 refresh rates는 60Hz에서 약 100Hz의 범위이다. 만약 또 다른 모델이 GPU에 렌더링되었다면, 모니터가 refreshing하는 동안, 그 보여지는 이미지는 두 개로 잘릴 것인데, 그 top portion은 old image를 포함하고, bottom portion은 새 것을 포함할 것이다. 이 효과는 tearing이라고 불려진다.

이것을 피하기 위해서, DXGI는 swapping이라고 불려지는 특징을 구현한다.

모니터에 직접적으로 새로운 이미지들을 렌더링하는 대신에, DXGI는 너의 이미지들을 픽셀의 2차 버퍼에 그려놓는다, back buffer라고 불려지는. 그 front buffer는 현재 보여지고 있는 버퍼가 될 것이다. 너는 모든 너의 이미지를 back buffer에 그리고, 너가 끝났을 떄, DXGI는 back buffer의 내용으로 front buffer를 업데이트할 것이고, old image를 버릴 것이다.

그러나, 이것을 하는 것은 여전히 tearing을 발생시킬 수 있다. 왜냐하면 그 이미지 transfer가 여전히 모니터가 refreshing하는 동안 발생할 수 있기 때문이다 (GPU는 모니터보다 더욱 매우 빠르다).

이것을 피하기 위해 (그리고 전체를 더 빠르게 하기 위해), DXGI는 각 버퍼에 대한 포인터를 사용한다 (both front and back) 그리고 그것들의 값을 간단히 바꾼다. 그 back buffer는 그러고나서 front buffer가 되고 (끄리고 역으로), 그래서 어떠한 tearing이 발생하지 않는다.

물론, 우리는 이렇게 부가적인 back buffers를 추가하여 우리의 게임이 더 좋은 성능을 갖도록 할 수 있다.

이 설정은 swap chain이라고 불려지는데, 그것이 buffers의 chain이기 때문이고, 새로운 프레임이 렌더링될 때 마다, 위치를 swap한다.

The Rendering Pipeline
만약 그래픽스 프로그래밍에서 너가 들을 한 가지 것이 있따면, 그것은 렌더링 파이프라인이다. 이것은 왜냐하면 그 렌더링 파이프라인은 모든 것이 발생하는 곳이기 때문이다.

렌더링 파이프라인은 스크리엔 렌더링된 3D image를 만드는 프로세스이다. 그것은 assembly-line처럼 작동한다, 한 단계 긑나고 한 단계씩. 그것은 GPU에서 실행되는 단계들로 구성된다.

우리는 여기에서 모든 단계들을 다루지 않을 것이지만, 우리는 몇 가지만 다룰 것이다. 우리는 시작하기 위해서 이러한 단계들을 이해할 필요가 있을 것이고, 그러고나서 우리가 진행함에 따라 나머지를 알 수 있다.

Input-Assembler Stage는 파이프라인에서 첫 번째 단계이다. 그것의 책임은 말하자면 "음식을 씹는 것"이다. 그것은 너가 렌더링하길 원하는 3D 모델에 관해 비디오 메모리로부터 정보들을 모은다. 그러고나서, 그것은 그 정보를 컴파일 하고 렌더링을하기 위해 그것을 준비한다.

Rasterizer Stage는 그 back buffer images가 어디에 그려져야할 지를 결정하는데 책임이 있다. 좀 더 구체적으로, 어떤 정확한 픽셀이 그려져야 하고, 그것들이 어떤 컬러가 되어야 할지를 결정한다.

Output-Merger Stage는 파이프라인에서 마지막 단계이다. 그것의 일은 개별 모델 이미지를 한 개의 전체 이미지로 결합하는 것이고, 그 이미지를 정확히 back buffer에 놓는 것이다.

--- The Coordinate System 생략 ---
-> 왼손 좌표계, 스크린 방향이 -Z 방향


--- 3D Geometry 생략 ---
-> Face Culling은 ClockWise로 해야, Counter ClockWise가 렌더링 안됌.






댓글 없음:

댓글 쓰기