Vulkan Tutorial (1) - Introduction
About
이 튜토리얼은 Vulkan의 그래픽스와 컴퓨팅 API를 사용하는 기본기를 가르쳐줄 것입니다. Vulkan은 현대 그래픽 카드의 추상화를 보다 더 낫게 제공하도록 Khronos Group(OpenGL로 알려진)에서 만든 새로운 API입니다. 새로운 인터페이스는 어플리케이션을 의도한대로 더 잘 작동되도록 하며, OpenGL이나 Direct3D같은 API보다 나은 향상과 덜 놀라운 드라이버 동작을 이끌 수 있습니다. Vulkan의 개념은 Direct3D 12와 Metal과 비슷합니다. 하지만 Vulkan은 완전한 크로스 플랫폼의 이점이 있어 Windows, Linux, Android를 동시에 개발할 수 있게 해줍니다.
하지만 이러한 이점을 얻기 위해 당신은 상당히 많은 API들을 학습해야 합니다. 그래픽 API와 관련된 모든 세부사항들은 당신의 어플리케이션에서 설정되어야 합니다. 프레임 버퍼를 생성하고, 버퍼나 텍스쳐 이미지 같은 오브젝트들의 메모리를 관리하는 것들까지 포함해서 말이죠. 그래픽 드라이버가 하는 일이 적다는 뜻은, 올바르게 작동할 수 있도록 당신의 어플리케이션에서 더 많은 것을 해야 한다는 것입니다.
중요한 건 Vulkan은 모두를 위한 것은 아니라는 점입니다. 높은 성능의 컴퓨터 그래픽을 열망하거나 관련된 분야에서 일을 하는 프로그래머들을 대상으로 합니다. 만약 컴퓨터 그래픽보다는 게임 개발에 더 관심이 있다면, OpenGL이나 Direct3D를 고수하는 것이 나을 것입니다. 다른 대안으로는 Unreal Engine이나 Unity같은, Vulkan을 지원하는 High Level API를 사용하는 것입니다.
이 튜토리얼을 따라가기 위한 몇가지 전제조건이 있습니다:
- Vulkan을 지원하는 그래픽 카드와 드라이버 (NVIDIA, AMD, Intel, Apple Silicon(또는 Apple M1))
- C++ 경험 (RAII, initializer lists에 대한 지식)
- C++ 17을 지원하는 컴파일러 (Visual Studio 2017+ GCC 7+, Clang 5+)
- 3D 컴퓨터 그래픽에 대한 약간의 경험
이 튜토리얼에선 OpenGL이나 Direct3D에 대한 지식이 있다고 가정하지 않습니다. 하지만 3D 컴퓨터 그래픽에 대한 기초 지식은 필요합니다. 예를 들면, perspective projection에 대한 수학적인 내용은 설명하지 않습니다. 이 온라인 서적에서 컴퓨터 그래픽에 대한 좋은 설명을 볼 수 있습니다. 컴퓨터 그래픽에 대한 다른 훌륭한 자료들도 있습니다:
- Ray tracing in one weekend
- Physically Based Rendering book
- Vulkan being used in a real engine in the open-source Quake and DOOM 3
당신이 원한다면 C++ 대신 C를 사용할 수도 있습니다. 하지만 다른 선형대수 라이브러리를 사용해야 하고, 스스로 코드 구조를 작성해야 합니다. 우리는 class나 RAII같은 C++ 기능을 사용할 것입니다. Rust 개발자가 할 수 있는 튜토리얼의 다른 버전도 존재합니다.
다른 프로그래밍 언어를 사용하는 개발자가 쉽게 따라오기 위해서, Vulkan을 사용할 때 오리지날 C의 API를 사용할 것입니다. 하지만 만약 당신이 C++을 사용한다면, 몇가지 더러운 작업들을 추상화하여 오류를 예방할 수 있도록 새로 만들어진 Vulkan-Hpp를 사용하는 것을 권장합니다.
E-book
튜토리얼을 e-book으로 보고 싶다면 EPUB이나 PDF 버전을 다운로드 받을 수 있습니다:
튜토리얼 구조
우리는 Vulkan이 작동하기 위해서 어떤 일을 해야하는지 개요를 살펴볼 것입니다. 그리고 처음으로 화면에 삼각형을 띄워보겠습니다. 모든 작은 목적들은 당신이 그것들의 기본적인 역할들을 이해하면서 큰 그림을 이해하는 감각을 익힐 수 있도록 할 것입니다. 다음으로, 우리는 Vulkan SDK와 GLM library, 선형대수 계산을 위한 GLFW 같은 개발 환경을 세팅할 것입니다. Windows에서는 Visual Studio를, 그리고 Ubuntu Linux에서는 GCC를 어떻게 세팅하는지 안내합니다.
그 후에 첫번째 삼각형을 렌더하기 위해 필요한 Vulkan 프로그램의 기본 구성 요소들을 구현할 것입니다. 각 챕터에서는 대략적으로 이러한 구조를 따라갑니다:
- 새로운 개념과 목적 소개
- 프로그램에서 관련있는 API를 사용하기
- 일부를 helper function으로 추상화
각 챕터는 이전 챕터에 이어지는 내용이지만, Vulkan의 기능을 소개하는 독립적인 챕터로도 읽을 수 있습니다. 그건 이 사이트가 레퍼런스로써 유용하다는 뜻입니다. Specification에 링크를 클릭하면 당신은 Vulkan 함수와 타입들에 대해 더 배울 수 있습니다. Vulkan은 굉장히 새로운 API이기 때문에, 사양에 몇가지 단점이 존재할 수도 있습니다. Khronos 저장소에서 격려와 피드백을 보내주세요.
앞서 말했듯이, Vulkan API는 당신에게 그래픽 하드웨어를 최대로 통제하기 위한 많은 매개변수를 제공하는 API입니다. 이건 간단한 텍스쳐를 만드는데 매번 수 많은 단계의 기초적인 명령들을 반복하게끔 합니다. 그러므로 우리는 튜토리얼을 통해 우리만의 helper들을 만들 것입니다.
매 챕터에 그 시점까지의 전체 소스코드가 링크될 것입니다. 당신이 코드 구조에 대해 궁금하거나 버그가 있어서 비교하고 싶다면 볼 수 있습니다. 모든 코드는 정확성을 확인하기 위해 여러 업체의 그래픽 카드에서 테스트가 되었습니다. 각 챕터에는 또한 코멘트를 남길 영역이 있어서 특정 주제와 관련된 어떠한 질문도 가능합니다. 당신의 플랫폼, 드라이버 버전, 소스코드, 예상되는 동작과 실제 동작을 남겨주시면 우리가 도울 수 있습니다.
이 튜토리얼은 커뮤니티 활동을 위한 것입니다. Vulkan은 굉장히 새로운 API이고 아직 정립된 학습 방법이 없습니다. 이 사이트에서 튜토리얼을 하면서 어떠한 종류의 피드백이든 있다면, 망설이지 말고 GitHub 저장소에 pull request를 해서 이슈를 제출해주세요. 저장소에서 튜토리얼의 업데이트 상황을 볼 수 있습니다.
Vulkan을 구동하여 화면에 삼각형을 그리는 작업을 한 후, 선형 변환, 텍스처, 3D 모델과 같은 기능을 포함하는 프로그램으로 확장할 것입니다.
예전에 그래픽스 API를 해본 적이 있다면, 화면에 첫 도형이 그려지기 위해 얼마나 많은 과정이 있는지 알 것입니다. Vulkan에는 많은 초기화 단계가 있지만, 각 단계가 불필요하다고 생각되지는 않을 것입니다. 지루하기 짝이 없는 삼각형을 그리고 나면, 텍스처가 있는 3D 모델을 그리는 데에는 많은 추가 작업이 필요하지 않으며, 각 단계에서 보다 성취감을 얻을 수 있을 것입니다.
만약 튜토리얼을 하는 도중 어떤 문제를 겪게 되면, FAQ에 그 문제와 해결법이 있는지 먼저 확인해보세요. 그래도 막힌다면 관계된 챕터에 코멘트를 남기세요.
고성능 차세대 그래픽스 API로 뛰어들 준비가 되셨나요? 가시죠!