# Vulkan을 배워 소형 게임 엔진 개발

> Clean Markdown view of GeekNews topic #15215. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=15215](https://news.hada.io/topic?id=15215)
- GeekNews Markdown: [https://news.hada.io/topic/15215.md](https://news.hada.io/topic/15215.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-06-07T09:42:22+09:00
- Updated: 2024-06-07T09:42:22+09:00
- Original source: [edw.is](https://edw.is/learning-vulkan/)
- Points: 3
- Comments: 1

## Topic Body

#### 목차
- 서문
- 그래픽 프로그래밍 학습
- 사소한 문제에 집착하지 않기
- 왜 Vulkan인가?
- Vulkan 학습
- 엔진 개요 및 프레임 분석
- 일반적인 조언
  - 추천 Vulkan 라이브러리
  - GfxDevice 추상화
  - 셰이더 처리
  - 푸시 상수, 디스크립터 셋 및 바인드리스 디스크립터
  - 파이프라인 패턴
  - 프로그래머블 버텍스 풀링(PVP) + 버퍼 직접 주소(BDA) 사용
  - 바인드리스 디스크립터
  - 매 프레임 업로드해야 하는 동적 데이터 처리
  - 소멸자, 삭제 큐 및 정리
  - 동기화
- 더 많은 구현 노트
  - 많은 스프라이트 그리기
  - 컴퓨트 스키닝
  - 게임 / 렌더러 분리
  - 씬 로딩 및 엔티티 프리팹
  - MSAA
  - UI
  - Dear ImGui 및 sRGB 문제
  - 기타 사항
- Vulkan으로 전환하면서 얻은 것
- 향후 작업

#### 서문
- Vulkan을 배우고 작은 게임 엔진을 작성한 경험을 문서화한 내용임.
- Vulkan에 대한 사전 지식 없이 3개월 동안 작업했음.
- 작은 3D 게임을 만들고 재사용 가능한 부분을 엔진으로 분리했음.

#### 그래픽 프로그래밍 학습
- 그래픽 프로그래밍을 처음 시작하는 사람은 OpenGL부터 배우는 것이 좋음.
- OpenGL을 통해 텍스처 모델을 화면에 표시하고 간단한 조명 및 그림자 매핑을 학습하는 것이 유용함.
- OpenGL 학습을 위한 추천 리소스:
  - [learnopengl.com](https://learnopengl.com/)
  - Anton’s OpenGL 4 Tutorials 책
  - Thorsten Thormählen의 강의 (처음 6개의 비디오 추천)

#### 사소한 문제에 집착하지 않기
- 사소한 문제에 집착하지 않도록 주의해야 함.
- "정말 필요한가?", "병목 현상이 될 것인가?"를 항상 자문해야 함.
- 필요하지 않은 기능은 나중에 추가할 수 있음.
- 간단한 게임부터 시작하고, 복잡한 엔진을 만들지 않도록 주의해야 함.

#### 왜 Vulkan인가?
- Vulkan은 최신 GPU 기능을 사용할 수 있고, 오픈 소스 기술과 표준을 선호하는 사람들에게 적합함.
- OpenGL은 작은 게임에 충분하지만, 최신 GPU 기능을 사용하기 어렵고, macOS에서는 사용이 제한됨.
- WebGPU는 Vulkan보다 배우기 쉽고, 브라우저에서 게임을 실행할 수 있음.

#### Vulkan 학습
- Vulkan 학습은 처음에는 어려워 보였지만, Khronos가 복잡한 부분을 단순화하고 유용한 라이브러리를 제공함으로써 학습이 쉬워졌음.
- 추천 Vulkan 학습 리소스:
  - [vkguide](https://vkguide.dev/)
  - TU Wien의 Vulkan 강의 시리즈
  - **3D Graphics Rendering Cookbook** 책
  - **Mastering Graphics Programming with Vulkan** 책

#### 엔진 개요 및 프레임 분석
- 엔진 이름은 EDBR (Elias Daler’s Bikeshed Engine)이며, Vulkan 학습 프로젝트로 시작됨.
- 엔진은 주로 작은 레벨 기반 게임에 적합함.
- 프레임 렌더링 과정:
  - 스키닝: 컴퓨트 셰이더를 사용하여 모델 스키닝 처리
  - 그림자 매핑: 4096x4096 깊이 텍스처 사용
  - 지오메트리 및 셰이딩: PBR 모델 사용
  - 깊이 해결: 프래그먼트 셰이더를 통해 수동으로 처리
  - 후처리 효과: 깊이 안개, 톤 매핑, 블룸 적용
  - UI: 하나의 드로우 콜로 UI 그리기

#### 일반적인 조언
##### 추천 Vulkan 라이브러리
- **vk-bootstrap**: Vulkan 초기화 코드 단순화
- **Vulkan Memory Allocator (VMA)**: 메모리 할당 관리
- **volk**: 확장 함수 로딩 단순화

##### GfxDevice 추상화
- `GfxDevice` 클래스는 Vulkan 기능을 캡슐화하고, Vulkan 컨텍스트 초기화, 스왑체인 생성 및 관리 등을 처리함.

##### 셰이더 처리
- GLSL을 사용하여 셰이더 작성.
- 빌드 단계에서 셰이더를 사전 컴파일하여 런타임 의존성을 줄임.

##### 푸시 상수, 디스크립터 셋 및 바인드리스 디스크립터
- Vulkan에서는 디스크립터 셋을 사용하여 셰이더에 데이터를 전달함.
- 바인드리스 디스크립터와 버퍼 직접 주소를 사용하여 디스크립터 셋 사용을 최소화함.

##### 파이프라인 패턴
- 파이프라인 클래스를 사용하여 드로잉 단계를 분리함.
- `init`, `cleanup`, `draw` 메서드를 통해 파이프라인 초기화, 정리, 드로잉을 처리함.

##### 프로그래머블 버텍스 풀링(PVP) + 버퍼 직접 주소(BDA) 사용
- 버텍스 타입을 하나로 통일하고, 셰이더에서 버텍스를 직접 접근함.
- 푸시 상수를 사용하여 버퍼 주소를 전달함.

##### 바인드리스 디스크립터
- 텍스처를 바인드리스 방식으로 관리하여 셰이더에서 직접 접근 가능하게 함.
- 텍스처 ID를 푸시 상수로 전달하여 샘플링함.

#### GN⁺의 의견
- Vulkan은 높은 성능과 최신 GPU 기능을 제공하지만, 초기 학습 곡선이 가파름.
- OpenGL을 먼저 학습한 후 Vulkan으로 전환하는 것이 좋음.
- Vulkan 학습을 위한 다양한 리소스가 존재하며, 이를 활용하면 학습이 쉬워짐.
- Vulkan을 사용하여 작은 게임 엔진을 작성하는 것은 그래픽 프로그래밍을 깊이 이해하는 데 도움이 됨.
- Vulkan의 복잡성을 줄이기 위해 유용한 라이브러리를 사용하는 것이 좋음.

## Comments



### Comment 25995

- Author: neo
- Created: 2024-06-07T09:42:22+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=40595741) 
##### 해커뉴스 댓글 요약

- **Minimal한 접근법의 효과**: 메타버스 클라이언트를 Rust로 작성 중이며, Vulkan, WGPU, Rend3를 사용해 복잡한 문제를 겪고 있음. WGPU는 다양한 플랫폼을 지원하려다 보니 개발이 어려움.

- **Vulkan의 장점과 OpenGL의 간편함**: Vulkan은 고급 GPU 기능을 최대한 활용할 수 있지만, OpenGL은 간단한 2D/저폴리 게임에 적합함. AAA 게임 산업은 그래픽 품질에 치중하지만, 많은 플레이어는 게임플레이에 더 관심이 있음.

- **필요한 기능만 구현**: 주니어 프로그래머들이 최신 도구와 "베스트 프랙티스"에 집착하는 경향이 있지만, 실제 문제 해결에 필요한 최소한의 기능에 집중하는 것이 중요함.

- **Vulkan의 복잡성**: Vulkan은 OpenGL에 비해 성능을 최적화하기 어렵고, 많은 코드와 동기화 작업이 필요함. 취미로는 OpenGL ES3가 더 간편함.

- **추가 추상화 레이어의 문제**: Vulkan을 배우는 자료들이 추가 추상화 레이어를 도입해 기본적인 메모리 관리 예제를 찾기 어려움.

- **Vulkan의 학습 곤란**: OpenGL은 배우기 쉬웠지만, Vulkan은 간단한 작업도 복잡하게 만듦. 새로운 기술을 배우는 데 시간이 많이 걸림.

- **과학 데이터 시각화를 위한 Vulkan 학습**: Vulkan을 배워 과학 데이터 시각화 엔진을 작성했으며, 학습 과정에서 많은 추상화를 이해하는 데 시간이 걸림.

- **Vulkan 학습의 어려움**: Vulkan을 실제 엔진에서 사용하는 방법을 이해하기 어려움. 좋은 추상화와 렌더링 순서를 결정하는 방법을 배우기 위해 더 많은 자료가 필요함.

- **그래픽 프로그래밍 커뮤니티의 지원**: Vulkan 엔진을 개발하는 과정에서 커뮤니티의 지원과 피드백이 큰 도움이 됨.
