DirectX는 MS가 제공하는 API이며, GPU를 제어하고 프로그래밍을 할 수 있는 저수준 API이다.
2D 그래픽을 처리하기 위한 컴포넌트로, 비디오 메모리에 직접 엑세스하여 효율적인 2D 이미지 렌더링을 지원한다.
2D 그래픽으로만 구성된 게임을 프로그래밍하는데 있어서 개발 난이도가 Direct3D보다 더 쉽다는 장점이 있다
3D 그래픽을 처리하기 위한 컴포넌트로, 3D 모델링, 렌더링, 텍스처 매핑 등과 같은 3D 그래픽 작업을 지원한다.
사운드를 처리하기 위한 컴포넌트로, 3D 오디오 효과, 다중 채널 사운드, MIDI 등과 같은 고급 오디오 기능을 제공한다.
입력 장치(키보드, 마우스, 조이스틱 등)와의 상호 작용을 지원하는 컴포넌트로, 게임 컨트롤 및 사용자 입력 처리에 사용된다.
멀티플레이어 네트워크 게임을 위한 네트워킹 API로, 다중 플레이어 게임 개발에 필요한 기능를 제공한다.
DirectX는 하드웨어 가속을 지원하여 게임이 높은 성능을 발휘할 수 있도록 돕는다. 그래픽 처리, 3D렌더링, 사운드 처리 등에 하드웨어 가속을 적용함으로써 게임의 성능을 향상시킬 수 있다.
DirectX는 주로 Windows 플랫폼에서 사용된다. 따라서 Windows 기반의 게임를 개발하려면 DirectX를 이해하고 활용할 수 있어야 한다.
DirectX는 그래픽과 오디오 처리에 특화된 API를 제공한다. 2D 및 3D 그래픽, 사운드 이팩트, 입력 처리 등을 다룰 수 있도록 도와주며, 게임의 시각적 및 청각적인 측면을 효과적으로 다룰 수 있게 한다.
많은 게임 엔진 및 개발 도구들이 DirectX를 기반으로 개발되었다.
Unity, Unreal Engine등의 인기 있는 게임 엔진은 DirectX를 지원하며, 이를 통해 게임 프로그래머는 보다 쉽게 고수준의 기능을 활용할 수 있다.
게임 프로그래밍에서 DirectX 외에도 OpenGL이나 Vulkan과 같은 그래픽 API가 있지만 DirectX는 특히 Windows 환경에서의 게임 개발에 강점을 가지고 있다.
또 한가지 중요한 이유는 게임 회사 면접시에 그래픽스에 대한 질문이 자주 나오기 때문에 게임프로그래머로서의 기본 지식 소양을 깊이있게 얼마나 알고 있느냐에 따라서 합격과 불합격이 결정되기 때문에 공부해둘 필요가 있다고 할 수 있겠다.
메모리 정보를 토대로 2D화면으로 출력하기 위한 일련의 단계를 '렌더링 파이프라인' 이라고 한다.
렌더링 파이프라인은 그래픽스 API(예: DirectX, OpenGL)나 게임 엔진(예: Unity, Unreal Engine)에서 구현되어 있으며 개발자는 이러한 API 또는 엔진을 사용하여 파이프라인의 각 단계를 제어하고 사용자 정의할 수 있다. 이를 통해 다양한 시각적 효과와 성능 최적화를 구현할 수 있다.
예를 들어 유니티의 씬 뷰에서 배치한 여러 사물들을 게임뷰에 그려주기 위해서는 CPU와 GPU의 도음이 필요한데 그려주는(렌더링)일을 전담하게끔 GPU에 외주를 떠넘기는 작업이다.
다음은 렌더링 파이프라인 단계이다.
3D 모델의 기본 구성 요소를 메모리에서 로드하고 정렬한다.
대부분의 경우, 이는 정점 데이터로 구성되어 있다.
입력으로 받은 정점 데이터를 처리하여 화면에 표시될 위치, 색상 및 기타 속성을 계산한다. 이러한 계산은 보통 3D 공간에서의 변환, 조면, 텍스처 매핑 등을 포함한다.
정점 데이터로부터 생성된 기본 도형(점, 선, 삼각형)을 확장하거나 변형하여 새로운 도형을 생성한다.
이 단계는 선택적으로 사용될 수 있다.
기하 쉐이더에서 생성된 도형을 화면에 표시될 픽셀로 변환한다.
이 과정은 3D 공간에서의 투영 및 클리핑을 수행한다.
래스터라이저로부터 생성된 각 픽셀에 대해 색상, 깊이 및 기타 속성을 계산한다.
이는 텍스처 매핑, 조명, 그림자 등을 처리하는 데 사용된다.
최종적으로 계산된 픽셀 값을 화면버퍼에 합성한다.
이 과정에서 깊이 테스트, 블렌딩 및 기타 후처리 작업을 수행한다.
CPU: 고급 인력, 복잡한 연산, 기억력이 뛰어남, 그러나 ALU(산술 놀리 장치(Arithmetic logic uniy))가 많지 않다.
GPU: ALU가 매우 많다(계산이 매우 빠름), 노가다 작업에 유리하다.
주로 서로 연관성이 없는 일들을 병렬처리한다.