수업/게임프로그래밍(DirectX)

[게임프로그래밍] DirectX - 1. 이론

이름?없음 2024. 3. 6. 17:20
반응형
반응형

DirectX란? : 마이크로소프트에서 만든 개발한 일련의 API모음 주로 윈도우 운영 체제에서 그래픽, 음향, 입력 장치 및 네트워킹과 같은 멀티미디어 작업을 수행하는 데 사용된다

 

DirectX는 게임 개발자 및 멀티미디어 응용 프로그램 개발자들에게 하드웨어 가속을 사용하여 높은 성능의 멀티미디어 경험을 제공하는 도구와 라이브러리를 제공한

주요 기능

1. DirectDraw : 2D 그래픽을 처리하기 위한 컴포넌트로, 비디오 메모리에 직접 엑세스하여 효율적인 2D 이미지 렌더링을 지원

 

2. Direct3D : 3D 그래픽을 처리하기 위한 컴포넌트로, 3D 모델링, 렌더링, 텍스처 매핑 등과 같은 3D 그래픽 작업을 지원

 

3. DirectSound : 사운드를 처리하기 위한 컴포넌트로, 3D 오디오 효과, 다중 채널 사운드, MIDI 등과 같은 고급 오디오 기능을 제공

 

4. DirectInput : 입력 장치(키보드, 마우스, 조이스틱 등)와의 상호 작용을 지원하는 컴포넌트로, 게임 컨트롤 및 사용자 입력 처리에 사용됨

 

5. DirectPlay : 멀티플레이어 네트워크 게임을 위한 네트워킹 API로, 다중 플레이어 게임 개발에 필요한 기능를 제공

 

DirectX는 PC 게임 및 멀티미디어 응용 프로그램에서 일반적으로 사용되며, 그래픽 및 사운드 하드웨어와 상호 작용하여 뛰어난 성는과 시각적 효과를 제공 새로운 버전이 나올 때마다 향상된 기능과 최신 하드웨어 지원이 추가되어 개발자들이 최신 기술을 활용할 수 있도록 돕고 있다

 

DirectX이전에는 보통 직접 그래픽 API를 만들어서 사용하였다고 한다

 

왜 배워야 하는가?

 

1. 하드웨어 가속 : DirectX는 하드웨어 가속을 지원하여 게임이 높은 성능을 발휘할 수 있도록 돕습니다 그래픽 처리, 3D렌더링, 사운드 처리 등에 하드웨어 가속을 적용한으로써 게임의 효율성과 성능을 향상시킬 수 있습니다

 

2. 플랫폼 호환성 : DirectX는 주로 Windows 플랫폼에서 사용되며, 많은 게임이 이 플랫폼에서 출시됩니다 따라서 Windows 기반의 게임를 개발하려면 DirectX를 이해하고 활용할 수 있어야 합니다.

 

3. 그래픽 및 오디오 프로그래밍 : DirectX는 그래픽과 오디오 처리에 특화된 API를 제공합니다. 2D 및 3D 그래픽, 사운드 이팩틑, 입력 처리 등을 다룰 수 있도록 도와주며, 게임의 시각적 및 청각적인 측면을 효과적으로 다룰 수 있게 합니다

 

4. 게임 엔진 및 도구 사용 : 많은 게임 엔진 및 개발 도구들이 DirectX를 기반으로 개발되었습니다 Unity, Unreal Engine등의 인기 있는 게임 엔진은 DirectX를 지원하며, 이를 통해 게임 프로그래머는 보다 쉽게 고수준의 기능을 활용할 수  있습니다

 

5. 커뮤니티 및 문서화 : DirectX는 많은 개발자들이 사용하고 있는 표준 기술이며, 이에 관한 다양한 자료와 커뮤니티가 존재합니다. 이러한 자원들을 통해 문제 해결, 최신 기술 습득, 정보 교류 등이 가능하며, 적극적인 지원과 정보 공유를 통해 개발자들이 성장할 수 있습니다

 

게임 프로그래밍에서 DirectX 외에도 OpenGL이나 Vulkan과 같은 그래픽 API가 있지만 DirectX는 특히 Windows 환경에서의 게임 개발에 강점을 가지고 있습니다.

 

또 한가지 중요한 이유는 게임 회사 면접시에 그래픽스에 대한 질문이 자주 나오기 때문에 게임프로그래머로서의 기본 지식 소양을 깊이있게 얼마나 알고 있느냐에 따라서 합격과 불합격이 결정되기 때무넹 공부해둘 필요가 있다고 할 수 있겠다

 

어떻게 배워야 할까?

 

1. 공식 문서와 튜토리얼 확인하기

- 마이크로소프트의 공식 DirectX 문서는 매우 유용합니다. DirectX SDK를 설치하고 공식 문서를 참고하여 기본적인 개념과 사용법을 익힐 수 있다

- DirectX SDK에는 샘플 코드와 튜토리얼도 포함되어 있으므로, 이를 활용하여 실제로 코드를 작성하며 학습할 수 있습니다

 

2. 책과 강의 참고하기

- DirectX에 관한 책이나 온라인 강의를 활용하여 체계적으로 학습할 수 있습니다. 강의와 책은 기본 개념을 전달하면서 예제 코드를 통해 실습할 수 있는 기회를 제공합니다.

 

3. 온라인 커뮤니티 활용하기

- DirectX를 학습하는 동안 생기는 질문이나 문제는 온라인 커뮤니티에서 도움을 얻을 수 있습니다 Stack Overflow나 DirectX 관련 포럼 등에서 다른 개발자들과 소통하며 지식을 나눌 수 있습니다

 

4. 프로젝트 진행하기

- 실제 게임 또는 멀티미디어 응용프로그램을 개발해 보면서 학습하는 것이 가장 효과적입니다. 작은 프로젝트부터 시작하여 단계적으로 복잡성을 높여가면서 익히면 좋습니다

 

5. 게임 엔진 사용하기

- Unity나 Unreal Engine과 같은 게임 엔진은 DirectX를 기반으로 개발되었습니다. 이러한 엔진을 활용하여 게임을 만들면 DirectX의 기능을 익힐 수 있습니다

 

6. 샘플 코드 분석

- DirectX SDK에 포함 된 샘플 코드를 분석하면서 실제 구현을 살펴보고 이해하는 것이 중요합니다. 이를 통해 실정에서 사용할 수 있는 기술과 패턴을 배울 수 있습니다

 

7. 지속적인 업데이트와 실습

- DirectX는 지속적으로 업데이트되고 발전하므로 최신 기술 동향을 따라가며 학습을 지속하는 것이 중요합니다. 실제로 코드를 작성하면서 새로운 기능을 익히고 실험하는 것이 좋습니다

 

DirectX 학습은 시간과 노력이 필요하며 실제로 코드를 작성하고 실험하는 것이 중효합니다. 입문자는 기초 개념부터 차근차근 학습하면서 중요한 개념과 기술을 습득할 수 있습니다

 

렌더링 엔진이란?

렌더링 엔진은 컴퓨터 그래픽스에서 3D 모뎅을 화명에 표시하기 위한 핵심 소프트웨어 구성 요소입니다. 렌더링 엔진은 렌더링 파이프라인을 구현하고 3D 모델의 처리, 렌더링, 그래픽스 효과 및 최적화를 담당합니다.

 

렌더링 엔진은 일반적으로 다음과 같은 주요 기능을 수행합니다

 

1. 그래픽스 API와 상호 작용

- 렌더링 엔진은 그래픽스 API(예 : DirectX, OpenGL, Vulkan)를 사용하여 하드웨어와 통신하고, 그래픽 작업을 수행합니다. 이를 통해 3D 모델의 렌더링 및 화면에 출력될 이미지의 생성를 처리합니다.

 

2. 렌더링 파이프라인의 구현

- 렌더링 엔진은 그래픽스 파이프라인의 각 단계를 구현하고 제어합니다. 이는 입력 어셈블리, 버텍스/기하/픽셀 쉐이더, 라스터라이저, 풀력 병합 등을 포함합니다.

 

 

3. 라이팅 및 재질

- 렌더링 엔진은 조명, 그림자, 반사, 광택 등과 같은 라이팅 효과를 처리하고, 3D 모델의 재질을 관리합니다. 이를 통해 현실적이고 다양한 시각적 효과를 구현할 수 있습니다

 

4. 카메라 및 뷰포트 관리 

- 렌더링 엔진은 카메라의 시점을 관리하고, 화명에 보이는 영역인 뷰포트를 설정합니다. 이를 통해 사용자에게 올바른 시각적 표현을 제공합니다

 

5. 충돌 감지

- 몇몇 렌더링 엔진은 물리 엔진과 함께 작동하여 객체 간의 충돌을 감지하고 반응합니다. 이는 게임이나 시뮬레이션에서 중요한 역할을 합니다

 

6. 최적화 및 성능 향상

- 렌더링 엔진은 그래픽스 작업의 성능을 최적화하고, 하드웨어의 기능을 최대한 활용하여 부드럽고 빠른 화면 출력을 제공합니다.

 

렌더링 엔진은 게임 엔진의 중요한 부분이며, 대부분의 게임 엔진은 자체 내장된 렌더링 엔진을 포함하고 있습니다. 이러한 엔진은 개발자에게 렌더링 및 그래픽스 작업을 단순화하고, 고수준의 시각적 효과와 성능을 제공하는데 도움이 됩니다

 

렌더링 파이프라인이란?

렌더링 파이프라인은 컴퓨터 그래픽스에서 3D 모델을 화면에 그리는 과정을 나타내는 개념입니다. 이것은 3D 그래픽스의 핵심 개념중 하나로, 컴퓨터 게임, 시뮬레이션, 가상 현실에플리케이션 등에서 사용됩니다. 렌더링 파이프라인은 여러 단계로 구성되어 있으며, 각 단계는 입력 데이터를 받아들여 이를 처리하여 최종적으로 화면에 표시될 이미지를 생성합니다

 

일반적으로 렌더링 파이프라인은 다음과 같은 단계로 구성됩니다

 

1. 입력 어셈블리(Input Assembly)

- 3D 모델의 기본 구성 요소를 메모리에서 로드하고 정렬합니다. 대부분의 경우, 이는 정점 데이터로 구성되어 있습니다

 

2. 버텍스 쉐이더(Vertex Shader)

- 입력으로 받은 정점 데이터를 처리하여 화면에 표시될 위치, 색상 및 기타 속성을 계산합니다. 이러한 계산은 보통 3D 공간에서의 변환, 조면, 텍스처 매핑 등을 포함합니다.

 

3. 기하 쉐이더(Geometry Shader, 선택적)

- 정점 데이터로부터 생성된 기본 도형(점, 선, 삼각형)을 확장하거나 변형하여 새로운 도형을 생성합니다. 이 단계는 선택적으로 사용될 수 있습니다.

 

4. 라스터라이저(Rasterizer)

- 기하 쉐이더에서 생성된 도형을 화면에 표시될 픽셀로 변환합니다. 이 과정은 3D 공간에서의 투영 및 클리핑을 수행합니다.

 

5. 픽셀 쉐이더(Pixel Shader)

- 라스터라이저로부터 생성된 각 픽셀에 대해 색상, 싶이 및 기타 속성을 계산합니다. 이는 텍스처 매핑, 조명, 그림자 등을 처리하는 데 사용됩니다.

 

6. 출력 병합(Output Merge)

- 최종적으로 계산된 픽셀 값을 화면버퍼에 합성합니다. 이 과정은 깊이 테스트, 블렌딩 및 기타 후처리 작업을 수행합니다

 

렌더링 파이프라인은 그래픽스 API(예: DirectX, OpenGL)나 게임 엔진(예: Unity, Unreal Engine)에서 구현되어 있으며 개발자는 이러한 API 또는 엔진을 사용하여 파이프라인의 각 단계를 제어하고 사용자 정의할 수 있습니다. 이를 통해 다양한 시각적 효과와 성능 최적화를 구현할 수 있습니다.

 

예를 등어 유니티의 씬 뷰에서 배치한 여러 사물들을 게임뷰에 그려주기 위해서는 CPU와 GPU의 도음이 필요한데 그려주는(렌더링)일을 전담하게끔 GPU에서 외주를 떠넘기는 작업이다

 

CPU와 GPU의 차이점

 

CPU는 고급인력에 해당되는 소수인력 집단이다

- ALU(산술 놀리 장치(Arithmetic logic uniy))는 두뇌에 해당한다

 (고급 두뇌를 가졌기 때문에 어려운 문제를 해결 가능)

 

GPU는 값싼 인력들이 모여서 연산만 중점적으로 하는 인력사무소 같은곳

- 대부분이 ALU가 차지하고 있는데 말 그대로 계산기같은 역할을 수행

- 주로 서로 연관성이 없는 일들을 병렬처리

- 대표적인 예를 들어보면 "비트코인 채굴"러 들 수 있슨데 수학적인 문제를 푸는 셈 

 

 

유니티를 예로 들어보면 씬에 무엇을 배치하고 이를 메모리에 올린 정보를 토대로 게임뷰로 결과물을 출력하기 위한 단계들을 천재적인 전문가들이 연구를 계속 해왔으며 그 단계를 스테이지로 표현한 방법이 렌더링 파이프라인이라고 한다

 

테셀레이션 스테이지가 하는 간단한 설명(정점을 추가하는 기능을 담당)

 

DirectX11에 추가됨

 

예를들어 MMORPG에서의 지형이 있을 때 가까운곳의 지형은 좀 더 자세하게 보이고 멀리있는 지형은 허접하게 보이게 하는 기능을 담당한다

 

결국 DirectX는 마소에서 제공하는 GPU외주 라이브러리라고 볼 수 있겠다

 

GPU제조사들(그래픽 카드 제공업체, AMD 또는 지포스)은 마소와 협업을 해서 DirectX의 스펙에 맞춰서 제조를 하게 되는것이다

반응형