プログラミング
Vulkanチュートリアル
Vulkan Tutorial (vulkan-tutorial.com)
要約
このVulkanチュートリアルは、VulkanグラフィックスおよびコンピュートAPIの基本を学ぶためのリソースです。Vulkanは、現代のグラフィックスカードの抽象化を向上させ、パフォーマンス改善の可能性を秘めた新しいAPIですが、その分APIは冗長で、開発者はより多くの作業を行う必要があります。このチュートリアルは、C++の経験があり、高性能コンピュータグラフィックスに情熱を燃やす開発者を対象としています。
全文翻訳
はじめに
このチュートリアルをフォローする前に読んでください
E-bookについて
チュートリアルの構成
ライセンス
このチュートリアルをフォローする前に読んでください
このチュートリアルは、Vulkanが最初にリリースされた2016年頃に書かれました。それ以来多くのことが変わっており、このチュートリアルは今日Vulkanを使用する最善の方法を反映していません。代わりに、このウェブサイトを読む代わりに、次のガイドまたはリンクされたチュートリアルのいずれかをフォローすることをお勧めします: https://vulkan.org/learn
このチュートリアルについて
このチュートリアルでは、VulkanグラフィックスおよびコンピュートAPIの使用の基本を学びます。Vulkanは、Khronosグループ(OpenGLで知られています)による新しいAPIで、現代のグラフィックスカードのより優れた抽象化を提供します。この新しいインターフェースにより、アプリケーションが何をしたいのかをより良く記述できるようになり、既存のAPI(OpenGLやDirect3Dなど)と比較して、パフォーマンスの向上やドライバーの予期せぬ動作の減少につながる可能性があります。Vulkanの背後にある考え方はDirect3D 12やMetalと似ていますが、Vulkanは完全にクロスプラットフォームであるという利点があり、Windows、Linux、Androidで同時に開発できます。
しかし、これらのメリットの代償として、大幅に冗長なAPIを扱う必要があります。グラフィックスAPIに関連するすべての詳細(バッファやテクスチャ画像などのオブジェクトの初期フレームバッファ作成やメモリ管理を含む)は、アプリケーションからゼロからセットアップする必要があります。グラフィックスドライバーはあまり手助けをしてくれないため、アプリケーション側で正しい動作を保証するために、より多くの作業を行う必要があります。
ここでの要点は、Vulkanが誰にでも向いているわけではないということです。高性能コンピュータグラフィックスに情熱を燃やし、ある程度の労力をかけることを厭わないプログラマーを対象としています。ゲーム開発に、コンピュータグラフィックスよりも興味がある場合は、OpenGLまたはDirect3Dにとどまることをお勧めします。これらはすぐにVulkanに置き換えられることはありません。もう一つの選択肢は、Unreal EngineやUnityのようなエンジンを使用することです。これらはVulkanを使用しながら、より高レベルのAPIを公開してくれます。
それを踏まえた上で、このチュートリアルをフォローするための前提条件をいくつか紹介します:
Vulkan対応のグラフィックスカードとドライバー(NVIDIA、AMD、Intel、Apple Silicon(またはApple M1))。
C++の経験(RAII、初期化子リストに慣れていること)。
C++17の機能を十分にサポートするコンパイラ(Visual Studio 2017以降、GCC 7以降、またはClang 5以降)。
3Dコンピュータグラフィックスに関する既存の経験。
このチュートリアルでは、OpenGLやDirect3Dの概念に関する知識は前提としませんが、3Dコンピュータグラフィックスの基本を知っている必要があります。例えば、透視投影の背後にある数学は説明しません。コンピュータグラフィックスの概念の優れた入門については、このオンラインブックを参照してください。
その他の優れたコンピュータグラフィックスリソースは以下の通りです:
Ray tracing in one weekend
Physically Based Rendering book
オープンソースのQuakeやDOOM 3でVulkanが使用されている例
C++の代わりにCを使用することもできますが、異なる線形代数ライブラリを使用する必要があり、コード構造に関しては自己責任となります。クラスやRAIIのようなC++の機能を使用して、ロジックとリソースのライフタイムを整理します。
Rust開発者向けの代替チュートリアルも2つあります: Vulkanoベース、Vulkanaliaベース。
他のプログラミング言語を使用する開発者がフォローしやすいように、またベースAPIの経験を得るために、オリジナルのC APIを使用してVulkanを扱います。しかし、C++を使用している場合は、一部の面倒な作業を抽象化し、特定のクラスのエラーを防ぐのに役立つ、より新しいVulkan-Hppバインディングを使用することを好むかもしれません。
E-book
このチュートリアルを電子書籍として読みたい場合は、EPUBまたはPDFバージョンをここでダウンロードできます: EPUB PDF
チュートリアルの構成
まず、Vulkanの仕組みの概要と、最初の三角形を表示するために行う必要がある作業について説明します。すべての小さなステップの目的は、全体像における基本的な役割を理解した後で、より意味をなすようになります。
次に、Vulkan SDK、線形代数演算用のGLMライブラリ、ウィンドウ作成用のGLFWを使用して開発環境をセットアップします。チュートリアルでは、Visual Studioを使用したWindowsでのセットアップ方法と、GCCを使用したUbuntu Linuxでのセットアップ方法をカバーします。
その後、最初の三角形をレンダリングするために必要な、Vulkanプログラムのすべての基本的なコンポーネントを実装します。各章は、大まかに以下の構造に従います:
新しい概念とその目的を紹介する。
それをプログラムに統合するための関連するすべてのAPI呼び出しを使用する。
一部をヘルパー関数に抽象化する。
各章は前の章の続きとして書かれていますが、特定のVulkan機能を導入するスタンドアロンの記事としても読むことができます。つまり、このサイトはリファレンスとしても役立ちます。
すべてのVulkan関数と型は仕様にリンクされているため、クリックして詳細を確認できます。
Vulkanは非常に新しいAPIであるため、仕様自体にいくつかの不備がある可能性があります。このKhronosリポジトリにフィードバックを送信することをお勧めします。
前述のように、Vulkan APIは、グラフィックスハードウェアに対する最大限の制御を提供するために、多くのパラメータを持つかなり冗長なAPIです。これにより、テクスチャの作成のような基本的な操作でも、毎回繰り返す必要がある多くのステップが必要になります。そのため、チュートリアル全体で独自のヘルパー関数のコレクションを作成します。
各章は、その時点までの完全なコードリストへのリンクで終わります。コードの構造について疑問がある場合や、バグに対処して比較したい場合は、それを参照できます。
すべてのコードファイルは、複数のベンダーのグラフィックスカードでテストされ、正しさが検証されています。各章の最後には、コメントセクションがあり、特定の主題に関連する質問をすることができます。プラットフォーム、ドライバーバージョン、ソースコード、期待される動作、実際の動作を指定して、私たちがお手伝いできるようにしてください。
このチュートリアルはコミュニティの努力を意図しています。Vulkanはまだ非常に新しいAPIであり、ベストプラクティスはまだ確立されていません。チュートリアルやサイト自体に関するフィードバックがあれば、GitHubリポジトリに問題またはプルリクエストを送信することをためらわないでください。リポジトリをウォッチして、チュートリアルの更新通知を受け取ることができます。
画面上に最初のVulkan対応三角形を描画するという儀式を終えたら、線形変換、テクスチャ、3Dモデルを含めるようにプログラムを拡張し始めます。グラフィックスAPIを以前に触ったことがあるなら、最初のジオメトリが画面に表示されるまでに多くのステップがあることを知っているでしょう。Vulkanにはこれらの初期ステップの多くがありますが、個々のステップは理解しやすく、冗長に感じられないことがわかります。また、あの退屈に見える三角形を描画した後、完全にテクスチャ加工された3Dモデルを描画することは、それほど多くの追加作業を必要とせず、それ以降の各ステップはよりやりがいがあることを覚えておくことも重要です。
チュートリアルをフォロー中に問題が発生した場合は、まずFAQを確認して、問題とその解決策がすでにリストされているかどうかを確認してください。それでも解決しない場合は、最も関連性の高い章のコメントセクションで助けを求めてください。
高性能グラフィックスAPIの未来に飛び込む準備はできていますか?始めましょう!
ライセンス
Copyright (C) 2015-2023, Alexander Overvoorde
内容は、特に断りがない限り、CC BY-SA 4.0ライセンスの下でライセンスされています。貢献することにより、あなたはあなたの貢献を同じライセンスの下で公開にライセンスすることに同意します。
コードディレクトリ内のコードリストは、CC0 1.0 Universalライセンスの下でライセンスされています。このディレクトリに貢献することにより、あなたはあなたの貢献を同じパブリックドメインライクなライセンスの下で公開にライセンスすることに同意します。
このプログラムは、有用であることを期待して配布されますが、いかなる保証もありません。商品性や特定目的への適合性の黙示の保証さえもありません。