일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- pcce 기출문제 10번 공원
- render target
- boj 5567
- pccp 기출문제 풀이
- pcce 기출문제 10번 지폐 접기 풀이
- pcce 기출문제 풀이
- pcce 기출문제 10번 공원 풀이
- tessellation
- root signature
- 백준 5567
- texture mapping
- 오블완
- boj 1991
- 잔디 기부 캠페인
- DirectX
- depth-stencil
- orthographic projection
- 렌더링 파이프
- PCCE
- boj 22942
- 데이터 체커
- DirectX12
- c++ 5567
- c++ 1991
- 잔디 기부
- gemmasprint
- directx 그래픽스
- pcce 기출문제 9번 지폐 접기
- constant buffre
- 프로그래밍공부
- Today
- Total
오구의코딩모험
[DirectX] Window Application 본문
게임 개발은 하드웨어를 효율적으로 활용하는 프로그래밍의 집합체입니다.
특히 GPU를 제어하는 DirectX와 같은 저수준 그래픽 API를 사용하면, 하드웨어의 성능을 최대한 이끌어낼 수 있습니다.
이번 글에서는 DirectX를 활용한 게임 프로그래밍에서 반드시 알아야 할 핵심 개념과 활용법을 설명합니다.
주요 학습 포인트
1. DirectX 개요: GPU 제어의 시작
- DirectX는 GPU를 직접 제어하고 프로그램을 개발하는 데 사용되는 저수준 그래픽 API입니다.
- GPU는 CPU와 별개의 메모리 구조와 동작 방식을 가지며, 이를 이해하는 것이 효율적인 프로그래밍의 시작입니다.
2. 라이브러리의 종류
- 정적 라이브러리 : 프로그램에 컴파일 시 포함되어 실행 파일 크기가 증가합니다.
- 동적 라이브러리 : 별도 파일로 존재하며, 실행 시 로드됩니다.
- 프로젝트 설정 시 `#pragma comment(lib, "라이브러리명")`를 사용해 간단히 추가할 수 있습니다.
3. Precompiled Header의 중요성
- Precompiled Header는 자주 사용되는 헤더 파일을 미리 컴파일하여 빌드 속도를 대폭 개선합니다.
- Visual Studio의 'stdafx.h' 파일이 대표적인 예입니다.
4. 스마트 포인터와 리소스 관리
- unique_ptr과 shared_ptr을 활용하면 메모리 누수를 방지할 수 있습니다.
- DirectX에서는 COM 객체 관리를 위해 Microsoft::WRL::ComPtr을 사용합니다.
5. GPU와 연관된 주요 개념
5.1 Device
- GPU와 CPU 간 리소스를 요청하고 전달하는 "사무소" 역할을 합니다.
5.2 CommandQueue
- GPU 작업을 관리하고 처리하기 위한 큐입니다.
5.3 SwapChain
- 더블 버퍼링을 지원하여, 화면 전환을 부드럽게 처리합니다.
5.4 DescriptorHeap
- GPU에 리소스를 요청하기 위한 "요청서" 역할을 하며, `View` 형태로 리소스를 전달합니다.
6. Root Signature와 Root Constants
Root Signature
- API bind slot와 HLSL bind slot을 매칭시키는 구조입니다.
Root Constants
- GPU에서 빠르게 데이터를 설정할 수 있도록 도와줍니다.
7. 렌더링 파이프라인 이해하기
- GPU 작업은 Buffer에 데이터 세팅 → 주소를 Constant Buffer View(CBV)로 등록 →
CommandQueue에 전달의 과정을 거칩니다.
- 효율적인 GPU 동작을 위해 동기화 문제가 발생하지 않도록 DescriptorHeap을 순차적으로 관리해야 합니다.
8. Constant Buffer 및 DescriptorHeap 생성
- Device에서 Buffer와 CBV 생성 후 `memcpy` 또는 `CopyDescriptors`로 데이터를 전송합니다.
- 작업 후에는 `CommandList`에 요청을 저장하여, GPU가 처리할 수 있도록 전달합니다.
9. Shader 코드와 .hlsli 파일
- Shader 코드 작성 시 `.hlsli` 파일을 사용해 상수 값을 정의합니다.
- HLSL에서 Root Signature 및 Bind Slot 설정이 필요합니다.
10. 버퍼와 인덱스 관리
- Index Buffer는 정점 데이터를 효율적으로 관리하기 위해 필수적입니다.
- DirectX는 버퍼 생성 및 관리에 최적화된 인터페이스를 제공합니다.
꿀팁
- 변수명 변경 단축키 : `Ctrl + R, R`로 일괄 변경 가능.
- 함수 구현부 자동 생성: 선언된 함수명에서 `Ctrl + .`을 누르면 간단히 포맷 생성 가능.
- SetDescriptorHeaps 사용 주의 : 느린 연산이므로 빈번히 사용하지 않도록 설계.
FAQ
1. DirectX와 OpenGL의 차이는 무엇인가요?
DirectX는 Windows와 Xbox에 최적화된 API이며, OpenGL은 플랫폼 독립적인 API입니다.
2. DescriptorHeap이 중요한 이유는?
GPU와 CPU가 효율적으로 리소스를 교환하기 위해 DescriptorHeap은 필수적입니다.
3. Root Signature는 왜 사용되나요?
API와 HLSL 간의 데이터 바인딩을 간소화하고 효율적으로 관리하기 위해 사용됩니다.
4. SetDescriptorHeaps가 느린 이유는 무엇인가요?
GPU와 CPU 간 동기화를 필요로 하며, 리소스 설정 과정이 복잡하기 때문입니다.
5. 렌더링 최적화를 위한 팁은?
적절한 버퍼 크기 관리, CommandList 재활용, Precompiled Header 활용 등을 추천합니다.
'Game > DirectX' 카테고리의 다른 글
[DirectX] 변환 행렬 (Matrix) (2) | 2024.12.16 |
---|---|
[DirectX] Component, 삼각 함수, Vector (4) | 2024.12.10 |
[DirectX] Input과 Timer, Material (1) | 2024.12.07 |
[DirectX] Texture Mapping, Depth Stencil View (1) | 2024.12.04 |
[DirectX] 그래픽스, 렌더링 파이프 (2) | 2024.11.22 |