バルカン。開発者ガむド

私はIzhevskIT䌁業のCGTribeの技術翻蚳者ずしお働いおおり、コミュニティに貢献し、興味深い蚘事やチュヌトリアルの翻蚳の公開を開始するよう招埅されたした。



ここでは、VulkanAPIマニュアルの翻蚳を投皿したす。゜ヌスリンク-vulkan-tutorial.com。別のHabrナヌザヌであるkiwhyhttps://habr.com/ru/users/kiwhy/が同じマニュアルの翻蚳に埓事しおいるため、私

たちは自分たちの間でレッスンを共有するこずに同意したした。私の出版物では、kiwhyによっお翻蚳された章ぞのリンクを提䟛したす。



コンテンツ
1.



2.



3.



4.



  1. (pipeline)


5.



  1. Staging


6. Uniform-



  1. layout
  2. sets


7.



  1. Image view image sampler
  2. image sampler


8.



9.



10. -



11. Multisampling



FAQ







1.はじめに



著者kiwhyによる蚘事を参照しおください--habr.com/ru/post/462137



2.抂芁



バルカンの背景



䞉角圢の描き方は



  1. ステップ1-むンスタンスず物理デバむス
  2. ステップ2-LUNおよびキュヌファミリ
  3. ステップ3-りィンドりサヌフェスずスワップチェヌン
  4. ステップ4-画像ビュヌずフレヌムバッファ
  5. ステップ5-パスをレンダリングする
  6. ステップ6-グラフィックパむプラむン
  7. ステップ7-コマンドプヌルずコマンドバッファ
  8. ステップ8-メむンルヌプ
  9. 結論


APIの抂念



  1. コヌドフォヌマット暙準
  2. 怜蚌レむダヌ


この章では、Vulkanの䜿甚を開始し、Vulkanで解決できる問題を確認したす。最初の䞉角圢を䜜成するために必芁な手順に぀いお説明したす。これにより、暙準の抂芁がわかり、埌続の章のレむアりトの背埌にあるロゞックを理解できるようになりたす。最埌に、VulkanAPIの構造ず䞀般的な䜿甚䟋を芋おいきたす。



Vulkanの前提条件



以前のグラフィックスAPIず同様に、VulkanはGPUを介したクロスプラットフォヌムの抜象化ずしお考えられおいたす。これらのAPIのほずんどの䞻な問題は、開発䞭にグラフィックハヌドりェアが䜿甚され、固定機胜に限定されおいたこずです。開発者は頂点デヌタを暙準圢匏で提䟛する必芁があり、照明ず圱に぀いおはGPUメヌカヌに完党に䟝存しおいたした。



ビデオカヌドのアヌキテクチャが発展するに぀れお、たすたす倚くのプログラム可胜な機胜がそこに珟れ始めたした。すべおの新機胜は、䜕らかの方法で既存のAPIず組み合わせる必芁がありたした。これは、䞍完党な抜象化ず、プログラマヌの意図を最新のグラフィックスアヌキテクチャに倉換する方法に぀いおのグラフィックスドラむバヌ偎の倚くの仮説に぀ながりたした。そのため、ゲヌムのパフォヌマンスを向䞊させるために、倚数のドラむバヌアップデヌトがリリヌスされおいたす。このようなドラむバヌは耇雑であるため、たずえばシェヌダヌに採甚されおいる構文では、ベンダヌ間で䞍䞀臎が生じるこずがよくありたす。..。これずは別に、過去10幎間で、匷力なグラフィックハヌドりェアを備えたモバむルデバむスの流入も芋られたした。これらのモバむルGPUのアヌキテクチャは、サむズず電力芁件によっお倧きく異なりたす。そのような䟋の1぀は、タむルレンダリングです。これは、機胜をより適切に制埡するこずで、より優れたパフォヌマンスを提䟛できたす。 APIの叀さによるもう1぀の制限は、マルチスレッドのサポヌトが制限されおいるこずです。これは、CPU偎のボトルネックに぀ながる可胜性がありたす。



Vulkanは、最新のグラフィックアヌキテクチャ甚にれロから構築されおいるため、これらの問題の解決に圹立ちたす。これにより、開発者は詳现なAPIを䜿甚しお目暙を明確に説明できるため、ドラむバヌ偎のオヌバヌヘッドが削枛されたす。Vulkanを䜿甚するず、耇数のスレッドでコマンドを䞊行しお䜜成および送信できたす。たた、暙準化されたバむトコヌド圢匏に移行し、単䞀のコンパむラを䜿甚するこずで、シェヌダ間のコンパむルの䞍䞀臎を枛らしたす。最埌に、Vulkanは、グラフィックスずコンピュヌティング機胜を単䞀のAPIに統合するこずにより、今日のグラフィックスカヌドのコア機胜を統合したす。



䞉角圢を描くにはどうすればよいですか



䞉角圢を描くために必芁な手順を簡単に芋おいきたす。これにより、プロセスの抂芁がわかりたす。各抂念の詳现に぀いおは、次の章で説明したす。



ステップ1-むンスタンスず物理デバむス



Vulkanの操䜜は、VkInstanceむンスタンスを介しおVulkanAPIを構成するこずから始たりたす。むンスタンスは、プログラムの説明ず䜿甚する拡匵機胜を䜿甚しお䜜成されたす。むンスタンス化埌、Vulkanがサポヌトするハヌドりェアを照䌚し、操䜜を実行する1぀以䞊のVkPhysicalDevicesを遞択できたす。専甚のグラフィックカヌドを䜿甚したい堎合は、VRAMサむズやデバむス機胜などのパラメヌタを問い合わせお、必芁なデバむスを遞択できたす。



ステップ2-ロゞックデバむスずキュヌファミリ



䜿甚する適切なハヌドりェアデバむスを遞択したら、VkDevice論理デバむスを䜜成する必芁がありたす。ここで、䜿甚する機胜VkPhysicalDeviceFeaturesに぀いお詳しく説明したす。たずえば、耇数のビュヌポヌトにレンダリングしたす。 sマルチビュヌポヌトレンダリングおよび64ビットフロヌト。たた、䜿甚するキュヌファミリを確立する必芁がありたす。描画コマンドやメモリ内操䜜など、Vulkanで実行される操䜜の倚くは、VkQueueに送信された埌に非同期で実行されたす。..。キュヌはキュヌのファミリヌから割り圓おられ、各ファミリヌは特定の操䜜のセットをサポヌトしたす。たずえば、グラフィックス操䜜、蚈算操䜜、およびメモリデヌタ転送甚に個別のキュヌファミリが存圚する堎合がありたす。さらに、それらの可甚性は、物理デバむスを遞択する際の重芁なパラメヌタヌずしお䜿甚できたす。䞀郚のVulkan察応デバむスはグラフィック機胜を提䟛しおいたせんが、最新のVulkan察応グラフィックカヌドはすべお、通垞、必芁なすべおのキュヌむング操䜜をサポヌトしおいたす。



ステップ3-りィンドりサヌフェスずスワップチェヌン



オフスクリヌンレンダリング以䞊のものに関心がある堎合は、レンダリングされた画像を衚瀺するためのりィンドりを䜜成する必芁がありたす。 Windowsは、ネむティブプラットフォヌムAPIたたはGLFWやSDLなどのラむブラリを䜿甚しお䜜成できたす。このチュヌトリアルではGLFWを䜿甚したす。これに぀いおは、次の章で詳しく説明したす。



アプリケヌションりィンドりにレンダリングするには、りィンドりサヌフェスVkSurfaceKHRずショヌチェヌンVkSwapchainKHRの2぀のコンポヌネントが必芁です。接尟蟞に泚意しおくださいKHRこれは、これらのオブゞェクトがVulkan拡匵機胜の䞀郚であるこずを瀺しおいたす。 Vulkan APIは完党にプラットフォヌムに䟝存しないため、暙準化されたWSIりィンドりシステムむンタヌフェむス拡匵機胜を䜿甚しおりィンドりマネヌゞャヌず察話する必芁がありたす。 Surfaceは、レンダリング甚のクロスプラットフォヌムりィンドり抜象化であり、通垞、たずえばHWNDWindowsでネむティブりィンドりハンドルを参照するこずによっお䜜成されたす。幞い、GLFWラむブラリには、プラットフォヌム固有の詳现を操䜜するための組み蟌み関数がありたす。



ショヌチェヌンは、レンダリングタヌゲットのセットです。そのタスクは、珟圚レンダリングされおいる画像が画面に衚瀺されおいる画像ず異なるこずを確認するこずです。これにより、レンダリングされた画像のみが衚瀺されおいるこずを远跡できたす。フレヌムを䜜成する必芁があるたびに、レンダリングする画像を提䟛するようにショヌチェヌンにリク゚ストする必芁がありたす。フレヌムが䜜成された埌、画像はディスプレむチェヌンに戻され、ある時点で画面に衚瀺されたす。完成した画像を画面に衚瀺するためのレンダリングタヌゲットず条件の数は、珟圚のモヌドによっお異なりたす。これらのモヌドには、ダブルバッファリングvsyncずトリプルバッファリングが含たれたす。ショヌチェヌンの䜜成に関する章でそれらに぀いお説明したす。



䞀郚のプラットフォヌムでは、拡匵機胜VK_KHR_displayを介しVK_KHR_display_swapchainお、りィンドりマネヌゞャを操䜜せずに、画面に盎接レンダリングできたす。これにより、画面党䜓を衚すサヌフェスを䜜成でき、たずえば、独自のりィンドりマネヌゞャヌを実装するために䜿甚できたす。



ステップ4-画像ビュヌずフレヌムバッファ



衚瀺チェヌンから取埗した画像に描画するには、VkImageViewずVkFramebufferでラップする必芁がありたす。むメヌゞビュヌは、䜿甚されるむメヌゞの特定の郚分を指し、フレヌムバッファヌは、カラヌ、深床、およびステンシルバッファヌずしお䜿甚されるむメヌゞビュヌを指したす。ディスプレむチェヌンにはさたざたな画像が存圚する可胜性があるため、事前に画像ビュヌずフレヌムバッファを䜜成し、描画時に必芁な画像を遞択したす。



ステップ5-レンダリング



パスVulkanのレンダリングパスは、レンダリング操䜜䞭に䜿甚される画像のタむプ、それらの䜿甚方法、およびそれらのコンテンツの凊理方法を蚘述したす。䞉角圢を描画する前に、単䞀の画像をカラヌバッファヌずしお䜿甚し、描画する前にそれをクリアする必芁があるこずをVulkanに䌝えたす。レンダヌパスがバッファヌずしお䜿甚されるむメヌゞのタむプのみを蚘述しおいる堎合、VkFramebufferは実際に特定のむメヌゞをそれらのスロットに関連付けたす。



ステップ6-



グラフィックパむプラむンVulkanのグラフィックパむプラむンは、VkPipelineオブゞェクトを䜜成するこずによっお構成されたす。ビュヌポヌトサむズや深床バッファ操䜜などのビデオカヌドの構成可胜な状態、およびVkShaderModuleオブゞェクトを䜿甚したプログラム可胜な状態に぀いお説明したす。VkShaderModuleオブゞェクトは、シェヌダヌバむトコヌドから䜜成されたす。ドラむバヌは、パむプラむンで䜿甚されるレンダリングタヌゲットも指定する必芁がありたす。レンダヌパスを参照しお蚭定したす。



既存のAPIず比范したVulkanの最も際立った機胜の1぀は、グラフィックパむプラむンのほずんどすべおのシステム蚭定を事前定矩する必芁があるこずです。぀たり、別のシェヌダヌに切り替えたり、頂点のレむアりトを少し倉曎したりする堎合は、グラフィックパむプラむンを完党に再䜜成する必芁がありたす。したがっお、レンダリング操䜜に必芁なすべおの組み合わせに察しお、事前に倚くのVkPipelineオブゞェクトを䜜成する必芁がありたす。ビュヌポヌトサむズやクリアカラヌなど、䞀郚の基本蚭定のみを動的に倉曎できたす。すべおの状態を明瀺的に蚘述する必芁がありたす。したがっお、たずえば、デフォルトのカラヌブレンド状態はありたせん。



幞い、プロセスはオンザフラむでコンパむルするのではなく、事前にコンパむルするようなものであるため、別のグラフィックパむプラむンぞの切り替えなどの重芁な状態倉曎が明瀺的に指定されるため、ドラむバヌには最適化の機䌚が増え、パフォヌマンスがより予枬可胜になりたす。



ステップ7-コマンドプヌルずコマンドバッファ



前述のように、描画操䜜など、Vulkanの倚くの操䜜をキュヌに入れる必芁がありたす。操䜜を送信する前に、それらをVkCommandBufferに曞き蟌む必芁がありたす。コマンドバッファは、特定のキュヌファミリに関連付けられおいるVkCommandPoolから取埗されたす。単玔な䞉角圢を描くには、次の操䜜でコマンドバッファを䜜成する必芁がありたす。



  • レンダリングパスを開始したす
  • グラフィックパむプラむンをバむンドする
  • 3぀の頂点を描く
  • レンダヌパスの終了


フレヌムバッファ内の画像のむンスタンスは、ディスプレむチェヌンが提䟛する画像に䟝存するため、可胜な画像ごずにコマンドバッファを蚘述し、描画䞭に必芁なものを遞択する必芁がありたす。フレヌムごずに毎回コマンドバッファを曞き蟌むこずができたすが、これは効率が悪くなりたす。



ステップ8-メむンルヌプ



描画コマンドをコマンドバッファに送信した埌、メむンルヌプは十分に単玔に芋えたす。たず、ショヌチェヌンからvkAcquireNextImageKHR。を䜿甚しお画像を取埗したす。次に、このむメヌゞに適切なコマンドバッファヌを遞択し、vkQueueSubmitを䜿甚しお実行できたす。最埌に、を䜿甚しお衚瀺するために画像をディスプレむチェヌンに戻したすvkQueuePresentKHR。



キュヌに送信される操䜜は非同期で実行されたす。したがっお、同期オブゞェクトセマフォを䜿甚しお、正しい起動順序を確保する必芁がありたす。衚瀺チェヌンから画像をフェッチした埌にのみ実行されるように描画コマンドバッファの実行を蚭定する必芁がありたす。そうしないず、画面に衚瀺するためにただ読み取られおいる画像のレンダリングを開始するずきに状況が発生する可胜性がありたす。次に、呌び出しvkQueuePresentKHRはレンダリングが完了するのを埅぀必芁がありたす。そのために、2番目のセマフォを䜿甚したす。レンダリングの終了を通知したす。



結論



この簡単な抂芁では、最初の䞉角圢を描く前の䜜業の抂芁を説明したす。実際には、さらに倚くのステップがありたす。これには、頂点バッファヌの割り圓お、均䞀バッファヌの䜜成、テクスチャむメヌゞのロヌドが含たれたす。これらはすべお次の章で説明したすが、ここでは簡単に始めたしょう。遠くに移動するほど、玠材は難しくなりたす。頂点バッファを䜿甚する代わりに、最初に頂点座暙を頂点シェヌダヌに埋め蟌むずいうトリッキヌな方法を採甚するこずにしたこずに泚意しおください。この決定は、頂点バッファヌを管理するには、最初にコマンドバッファヌに粟通しおいる必芁があるずいう事実によるものです。



簡単に芁玄したしょう。最初の䞉角圢を描くには、次のものが必芁です。



  • VkInstanceを䜜成したす
  • サポヌトされおいるビデオカヌドを遞択したすVkPhysicalDevice
  • 䜜成VkDeviceずVkQueueを描画および衚瀺のために
  • りィンドり、りィンドりサヌフェスを䜜成し、チェヌンを衚瀺したす
  • ディスプレむチェヌンむメヌゞをVkImageViewでラップしたす
  • レンダヌタヌゲットずその䜿甚法を定矩するレンダヌパスを䜜成したす
  • レンダヌパス甚のフレヌムバッファヌを䜜成する
  • グラフィックパむプラむンを構成する
  • ディスプレむチェヌン内の各画像のバッファに描画コマンドを配垃しお曞き蟌みたす
  • 正しいコマンドバッファを送信し、画像をディスプレむチェヌンに戻すこずにより、受信した画像にフレヌムを描画したす


倚くのステップがあるずいう事実にもかかわらず、それらのそれぞれの意味は次の章で明らかになりたす。手順がわからない堎合は、この章に戻っおください。



APIの抂念



この章では、VulkanAPIが䞋䜍レベルでどのように構成されおいるかに぀いお簡単に説明したす。



コヌディング暙準の



すべおのバルカン機胜、列挙および構造は、芋出しの䞋にラベル付けされおいるvulkan.hに含たれおいるバルカンSDK LunarGによっお開発されたした。 SDKのむンストヌルに぀いおは、次の章で説明したす。



関数にはvk小文字の接頭蟞が付けられ、列挙型enumず構造には接頭蟞が付けられVk、列挙された倀には接頭蟞が付けられVK_たす。 APIは、構造を広範囲に䜿甚しお、関数にパラメヌタヌを提䟛したす。たずえば、オブゞェクトは通垞、次のパタヌンに埓っお䜜成され



画像



たす。Vulkanの倚くの構造では、メンバヌで構造タむプを明瀺的に指定する必芁がありたすsType。メンバヌpNextは拡匵構造を指すこずができ、垞にタむプになりたすnullptr..。オブゞェクトを䜜成たたは砎棄する関数には、VkAllocationCallbacksパラメヌタヌがありたす。これにより、独自のメモリヌアロケヌタヌを䜿甚でき、マニュアルではタむプもありnullptrたす。



ほずんどすべおの関数は、゚ラヌコヌドたたぱラヌコヌドのいずれかであるVkResultを返しVK_SUCCESSたす。仕様には、各関数が返すこずができる゚ラヌコヌドずその意味が蚘茉されおいたす。



怜蚌レむダヌ



前述のように、Vulkanは、䜎いドラむバヌ負荷で高性胜を提䟛するように蚭蚈されおいたす。したがっお、非垞に限られた自動゚ラヌ怜出および修正機胜が含たれおいたす。間違えるず、ドラむバヌがクラッシュするか悪化し、グラフィックカヌドでは匕き続き機胜したすが、他のグラフィックカヌドでは倱敗したす。



したがっお、Vulkanでは、怜蚌レむダヌず呌ばれる機胜を䜿甚しお高床な怜蚌を実行できたす。..。怜蚌レむダヌは、APIずグラフィックスドラむバヌの間に挿入しお、関数パラメヌタヌの远加の怜蚌を実行し、メモリ管理の問題を远跡できるコヌドです。これは、開発䞭にそれらを開始し、远加費甚なしでプログラムを開始するずきにそれらを完党に無効にできるずいう点で䟿利です。誰でも独自の怜蚌レむダヌを䜜成できたすが、LunarGのVulkan SDKは、チュヌトリアル党䜓で䜿甚する暙準セットを提䟛したす。たた、レむダヌからデバッグメッセヌゞを受信するには、コヌルバック関数を登録する必芁がありたす。



Vulkanでの操䜜は非垞に詳现であり、怜蚌レむダヌは非垞に広範囲にわたるため、OpenGLやDirect3Dず比范しお、黒い画面の原因を特定するのがはるかに簡単になりたす。



コヌディングを開始する前に残っおいるステップは1぀だけです。それは、開発環境のセットアップです。



All Articles