問題タブ [vulkan]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
vulkan - レンダリングと並行して取得して提示することは不可能ですか?
注: 私は最新の OpenGL の知識がほとんどない Vulkan を自己学習しています。
Vulkan の仕様を読むと、コマンド バッファーとスワップチェーンの同期を可能にする非常に優れたセマフォが表示されます。これは、単純な(しかし非効率的だと思う)物事を行う方法であると私が理解していることです。
vkAcquireNextImageKHR
、シグナリングで画像を取得sem_post_acq
- 以下を使用してコマンド バッファーをビルドします (または事前にビルドされたものを使用します)。
- 画像を移行するための画像バリア
VK_IMAGE_LAYOUT_UNDEFINED
- 与える
- 画像を遷移する画像バリア
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
- 画像を移行するための画像バリア
sem_post_acq
キューに送信し、フラグメント ステージで待機し、シグナリングしsem_pre_present
ます。vkQueuePresentKHR
お待ちしておりsem_pre_present
ます。
ここでの問題は、コマンド バッファー内のイメージ バリアが、どのイメージが遷移しているかを認識している必要があることです。つまりvkAcquireNextImageKHR
、コマンド バッファーの作成方法 (または送信するビルド済みのコマンド バッファー) を知る前に、元に戻らなければなりません。ただし、vkAcquireNextImageKHR
潜在的に多くのスリープが発生する可能性があります (プレゼンテーション エンジンがビジー状態で、空き画像がないため)。一方で、コマンド バッファーの送信自体にコストがかかります。さらに重要なことは、最終結果がどのイメージにレンダリングされるかを知らなくても、フラグメントの前のすべてのステージを実行できることです。
理論的には、次のようなスキームを使用すると、より高度な並列処理が可能になるように思えます。
- 以下を使用してコマンド バッファーをビルドします (または事前にビルドされたものを使用します)。
- 画像を移行するための画像バリア
VK_IMAGE_LAYOUT_UNDEFINED
- 与える
- 画像を遷移する画像バリア
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
- 画像を移行するための画像バリア
sem_post_acq
キューに送信し、フラグメント ステージで待機し、シグナリングしsem_pre_present
ます。vkAcquireNextImageKHR
、シグナリングで画像を取得sem_post_acq
vkQueuePresentKHR
お待ちしておりsem_pre_present
ます。
これもまた、理論的には、vkAcquireNextImageKHR
. これが機能しない唯一の理由は、このイメージが後で決定されることを (適切な同期で) コマンド バッファに伝えることも、プレゼンテーション エンジンに特定のイメージを要求することもできないことです。
私の最初の質問は、私の分析は正しいですか? もしそうなら、そのような最適化はVulkanではまったく不可能ですか?なぜですか?
vkAcquireNextImageKHR
2 番目の質問は、取得したい特定の画像を特定して、それらを自分で反復処理できれば、より理にかなっていると思いませんか? そうすれば、どのイメージを要求するかを事前に知ることができ、それに応じてコマンド バッファーを構築して送信できます。
vulkan - Vulkan には同等の TransformFeedback がありますか
Vulkan は、パイプライン ステージからの頂点出力の保存をサポートしていますか? 私は探していましたが、例や参考文献が見つかりません。他の誰かが知っているのではないでしょうか?
graphics - D3D12 用の vkCmdBlitImage のようなものはありますか?
ベース イメージをミップ レベルにブリットして、2D テクスチャのミップマップ チェーンを作成したいと考えています。Vulkan ではvkCmdBlitImage
、画像を線形フィルタリングしながらこれを行うために使用できます (別の質問を参照してください)。D3D12で同じことを達成するにはどうすればよいですか?
opengl - ユニフォーム バッファまたはシェーダ ストレージ バッファ オブジェクト内で「vec3」を使用する必要がありますか?
vec3
タイプはとてもいいタイプです。3 つの float しか必要とせず、3 つの float しか必要としないデータがあります。そして、UBOおよび/またはSSBOの構造で1つを使用したい:
次に、C または C++ コードで、これを実行して一致するデータ構造を作成できます。
これは良い考えですか?
c++ - glslangの使い方
glslang を使用して glsl シェーダー コードを SPIR-V バイナリにコンパイルしようとしています。glslang プロジェクトは次の場所にあります。
https://github.com/KhronosGroup/glslang
コマンドラインで glslangValidator.exe を手動で使用すると、うまく機能します。しかし、私は c++ インターフェイスを使用したいと思います。
github ページに記載されているようにプロジェクトをビルドしましたが、実際にインターフェイスを使用する方法に苦労しています。
実際にはソリューションにプロジェクトを含めたくありません (私は Visual Studio を使用しています) が、それを使用するために必要な .lib とヘッダーをリンクします。リンクする必要があるものを見つけることができません。github ページには ShaderLang.h と StandAlone.cpp しか記載されていませんが、これでは十分ではありません。
glslang を使用できるプロジェクトをセットアップする方法を誰かが説明できますか? glsl シェーダー コードを SPIR-V バイナリにコンパイルするためだけに必要です (シェーダー コンパイルに関するデバッグ情報を含む)。これは、すでにやったことがあるか、経験が豊富な人にとっては非常に簡単な質問だと思います。
c - VkApplicationInfo のポイントは何ですか?
VkInstance
新しい Vulkan API には、 :を作成するために必要な構造体がありますVkApplicationInfo
。定義は次のとおりです。
アプリケーション名、アプリケーション バージョン、エンジン名、またはエンジン バージョンを渡さなければならないことに意味がありません。たぶん、実装はpNext
何にでもメンバーを使用したり、実装が指定されたものをサポートしているかどうかを確認したりできapiVersion
ます。それ以外では、他のメンバーが指定されている理由がわかりません。Vulkan の仕様によるとNULL
、実際の を使用する代わりに を使用することもできるためVkApplicationInfo
、さらに役に立たなくなります。この構造体からの情報は、(たとえば) などを使用してアプリで後で取得できますvkGetAppInfo(instance)
か? この構造の背後にある邪悪なマスター プランはありますか? それともただのデザインの悪さ?とにかく、なぜそれが存在し、なぜそれを使うべきなのかに興味があります。