問題タブ [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 - Vulkan と透明な窓
私は現在、自分のエンジンを Vulkan に適応させており、OpenGL で既に持っていた透明なウィンドウを再実装したいと考えています。
compositeAlpha
私がする必要があるのは、正しいカラー形式 (アルファ チャネル付き) を選択し、プロパティをに設定することだけだと思いVkSwapchainCreateInfoKHR
ましたVK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR
。
ただし、ウィンドウを完全に透明な色でクリアしても、期待どおりの結果が得られません。完全に不透明です。
もちろん、OpenGL を使用して以来変更されていないウィンドウ システムはそれをサポートしており、レンダリングを無効にすると、ウィンドウの想定される位置をクリックすることもできません。これは、そこにあることを示しています。
これを機能させるために他に必要な変更はありますか?
いくつかの情報
画像フォーマットはで、 Sascha Willems の例VK_FORMAT_B8G8R8A8_UNORM
に見られる vulkan セットアップを方向付けました。
c++ - Vulkan レイヤーは実行時に変更できますか?
そこで、Vulkan プログラミングを簡単にするライブラリを作りたいと思っていました。Githubで見ることができますが、すぐに何か大きなものを期待しないでください ;)。すべてのレイヤープロパティを返す関数を作成したいと思いgetInstanceLayerProperties
ます(明らかに)。これは遅くなる可能性があるため、最適化したいと考えました。私の考えは単純です。事前に計算された配列として保存します。私が知る必要があるのは、ランタイム中に Vulkan レイヤーを変更できるかどうかだけです。たとえば、 の値をキャッシュしたとしますvkEnumerateInstanceLayerProperties
。新しいレイヤー プロパティを削除、追加、または変更して、その関数を再度呼び出した場合に別の結果が得られるようにすることはできますか?
vulkan - マルチスレッド レンダリングとコマンド プール
結局のところ、コマンド バッファーを並行して構築できることは、Vulkan のセールス ポイントの 1 つです。
仕様(5.1コマンドプール)(強調鉱山):
コマンド プールはアプリケーションと同期されます。つまり、コマンド プールを複数のスレッドで同時に使用することはできません。これには、プールから割り当てられたコマンド バッファにコマンドを記録することによる使用、およびコマンド バッファまたはプール自体を割り当て、解放、およびリセットする操作が含まれます。
並行して記録する場合、この種のコマンド プールの目的全体が殺されませんか? 並行して記録する場合は、スレッドごとに個別のプールを用意したほうがよいのではないでしょうか。
すべて同じプールから (1 つのスレッドで) 割り当てられたコマンド バッファーを事前に記録し、それらを並列に実行する場合、それは理解できます。これには、償却されたリソース作成コストと並列実行の利点があります。ただし、並行記録とコマンド プールはあまり一致していないようです。
なぜすべてを事前に記録しないのか、個人的にはわかりません。では、なぜ並行してコマンド バッファーを構築する必要があるのでしょうか。そして、スレッドごとに 1 つのプールを使用する必要があるでしょうか?
windows - Linux で Vulkan が物理デバイスを検出できない
新しいグラフィックス API である Vulkan を使いたいと思っていましたが、Windows 7 で問題なく起動して実行できました。しかし、Vulkan を Linux で動作させることができません。LunarG のサンプルや自分のコードを実行しようとすると、vkEnumeratePhysicalDevices
常に物理デバイスがないと表示されます。これが私のセットアップです:
環境変数を設定する必要がある GPU 用のファイルがあるのではないかと思っていましたが、本当にわかりません。前に言ったように、これは Windows 7 で完全に機能しましたが、これを上記の構成で機能させることはできないようです。LunarG 標準検証レイヤーと正しい拡張機能を使用してインスタンスを作成できますが、vkEnumeratePhysicalDevices
物理デバイスが見つかりません。エラーにはなりませんが、物理デバイスが見つからないというだけです。これは本当に私を困惑させました。助けていただければ幸いです。ありがとう!
c++ - Vulkan ユニフォーム シェーダー データ
私がopenglから慣れているのは、コマンドバッファ内でリソースがシェーダーにバインドされていることglUniformMatrix4fv
でした. 今私が見ることができる限り、同等のものはvkCmdPushConstants
.
ただし、すべてのオブジェクトのデータを含む大きなバッファーを作成するオプションもあります。そしてvkCmdBindDescriptorSets
、シェーダーが対応するオブジェクトのデータを使用するようにオフセットを変更するために使用します(ここで何かが間違っているのは正しいです、これが私がそれを行うことができると思う方法です)。しかし、オブジェクトごとのデータをシェーダーに渡す「正しい」方法は何でしょうか? また、シェーダーがオブジェクトごとに変更する必要があるデータの量にどのように依存しますか。
もう 1 つの質問は、gpu と cpu の同期に関するものです。次のフレームのデータを GPU にコピーする前に、フレームの準備ができるまで待つ必要があります。では、コマンド バッファーでバッファー コピーを実行するにはどうすればよいでしょうか。そのようなvkFlushMappedMemoryRanges
ものはコマンドバッファを取ります次に、セマフォを設定し、データの使用が完了するのを待ってから、RAM からの次のフレームの新しいデータで gpu 上の古いデータを上書きすることができます。また、RAM では、スワップチェーン内の各画像に個別のバッファーを使用して、次のフレームのデータの書き込みを既に開始できるようにします (スワップチェーンの画像数まで)。そのバッファ コピーを同期できない場合は、swpachain イメージごとにオブジェクトごとのデータを含む GPU 上のバッファが必要になると思われます。そして、それは私にとってスペースの無駄のように思えます。
GPUメモリのRAMとGPUメモリの両方にシェーダーデータを含むバッファーが1つしかない場合、および各フレームの後にgpuをアイドル状態にしたくない場合(次の場合にのみ待機する必要があると思います)スワップチェーンに収まるすべてのフレームのコマンド バッファーを既に送信しています)。
- cpu は、フレーム 0 のオブジェクトの位置を GPU にプッシュします。
- cpu はフレーム 1 のコマンド バッファをコミットします。
- GPU はフレーム 0 のレンダリングを開始します
- CPU はフレーム 1 のオブジェクト位置を GPU にプッシュします
- cpu はフレーム 1 のコマンド バッファをコミットします。
- GPU はフレーム 0 を終了します
- GPU はフレーム 1 を開始します
- GPU はフレーム 1 を終了します
この例では、フレーム 1 のデータは、まだフレーム 0 をレンダリングしている間に既に GPU にプッシュされており、これによりフレーム 0 が破損しています。
私の投稿が少し支離滅裂または曖昧で申し訳ありませんが、あなたが完全に理解していない問題を説明するのは難しいです.
編集: 頂点ごとはオブジェクトごとにすべきでした。
私が探している関数は、VkCmdFillGpuMemory(VkCommandBuffer commandbuffer, VkDeviceMemory myMemory, void* ramData) です。できれば、データの一部のみをコピーする範囲オプションも使用します (そのため、データが変更されたオブジェクトのデータのみをコピーするオプションがあります)。