3P by neo 3달전 | favorite | 댓글 1개

목차

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

서문

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

그래픽 프로그래밍 학습

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

사소한 문제에 집착하지 않기

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

왜 Vulkan인가?

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

Vulkan 학습

  • Vulkan 학습은 처음에는 어려워 보였지만, Khronos가 복잡한 부분을 단순화하고 유용한 라이브러리를 제공함으로써 학습이 쉬워졌음.
  • 추천 Vulkan 학습 리소스:
    • vkguide
    • 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의 복잡성을 줄이기 위해 유용한 라이브러리를 사용하는 것이 좋음.
Hacker News 의견

해커뉴스 댓글 요약

  • 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 엔진을 개발하는 과정에서 커뮤니티의 지원과 피드백이 큰 도움이 됨.