QRhiCommandBuffer Class
コマンドバッファリソース。詳細...
Header: | #include <rhi/qrhi.h> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate) |
qmake: | QT += gui-private |
Since: | Qt 6.6 |
Inherits: | QRhiResource |
パブリック型
enum | BeginPassFlag { ExternalContent, DoNotTrackResourcesForCompute } |
flags | BeginPassFlags |
DynamicOffset | |
enum | IndexFormat { IndexUInt16, IndexUInt32 } |
VertexInput |
パブリック関数
void | beginComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {}) |
void | beginExternal() |
void | beginPass(QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {}) |
void | debugMarkBegin(const QByteArray &name) |
void | debugMarkEnd() |
void | debugMarkMsg(const QByteArray &msg) |
void | dispatch(int x, int y, int z) |
void | draw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0) |
void | drawIndexed(quint32 indexCount, quint32 instanceCount = 1, quint32 firstIndex = 0, qint32 vertexOffset = 0, quint32 firstInstance = 0) |
void | endComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr) |
void | endExternal() |
void | endPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr) |
double | lastCompletedGpuTime() |
const QRhiNativeHandles * | nativeHandles() |
void | resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates) |
void | setBlendConstants(const QColor &c) |
void | setComputePipeline(QRhiComputePipeline *ps) |
void | setGraphicsPipeline(QRhiGraphicsPipeline *ps) |
void | setScissor(const QRhiScissor &scissor) |
void | setShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr) |
void | setStencilRef(quint32 refValue) |
void | setVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16) |
void | setViewport(const QRhiViewport &viewport) |
再実装されたパブリック関数
virtual QRhiResource::Type | resourceType() const override |
詳細説明
現時点ではアプリケーションからは作成できない。有効なQRhiCommandBufferを取得する唯一の方法は、QRhiSwapChain::currentFrameCommandBuffer ()を介して対象のスワップチェーンから取得するか、完全にオフスクリーンでレンダリングする場合は、QRhi::beginOffscreenFrame ()を介して初期化することです。
注: これは互換性保証に制限のあるRHI APIです。詳細はQRhi を参照してください。
メンバー型ドキュメント
enum QRhiCommandBuffer::BeginPassFlag
flags QRhiCommandBuffer::BeginPassFlags
QRhi::beginPass() のフラグ値
定数 | 値 | 説明 |
---|---|---|
QRhiCommandBuffer::ExternalContent | 0x01 | このパスでQRhiCommandBuffer::beginExternal() の呼び出しがあることを指定します。このフラグが設定されておらず、beginExternal() が呼び出されたままの場合、一部のバックエンド、特に Vulkan は失敗します。 |
QRhiCommandBuffer::DoNotTrackResourcesForCompute | 0x02 | このパスで使用されるリソースを追跡する必要がないことを指定します。そのような追跡の唯一の目的は、計算のためのバリアを生成することです。フレーム内に計算パスがないことを意味します。これは、特定のバックエンド、特にOpenGLによって考慮される可能性のある最適化のヒントであり、特定の操作をスキップすることを可能にします。フレーム内のレンダーパスにこのフラグが設定されている場合、そのフレーム内でbeginComputePass() を呼び出すと、レンダーパスとコンピュートパスのリソース依存関係によっては予期しない動作になる可能性があります。 |
BeginPassFlags 型はQFlags<BeginPassFlag> の typedef です。BeginPassFlag 値の OR の組み合わせを格納します。
[alias]
QRhiCommandBuffer::DynamicOffset
QPair<int, quint32> の同義語です。最初のエントリはバインディングで、2 番目はバッファ内のオフセットです。
enum QRhiCommandBuffer::IndexFormat
インデックスのデータ型を指定します。
定数 | 値 | 説明 |
---|---|---|
QRhiCommandBuffer::IndexUInt16 | 0 | 符号なし16ビット(quint16) |
QRhiCommandBuffer::IndexUInt32 | 1 | 符号なし32ビット(quint32) |
[alias]
QRhiCommandBuffer::VertexInput
QPair<QRhiBuffer *, quint32>の同義語。2番目のエントリは、1番目のエントリで指定されたバッファ内のオフセットです。
メンバ関数ドキュメント
void QRhiCommandBuffer::beginComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
新しい計算パスの開始を記録する。
resourceUpdatesNULLでない場合は、コミットされ、リリースされるリソース更新バッチを指定する。
注意: パス間で状態やリソースのバインディングが持続すると仮定しないでください。
注意 : コンピュートパスは、setComputePipeline()、setShaderResources()、dispatch()コールを記録することができます。デバッグマーカーやbeginExternal ()などの一般的な機能は、レンダーパスとコンピュートパスの両方で使用できます。
注: 計算機能は、Compute 機能がサポートされていると報告された場合にのみ使用できます。
flags は現在使用されていません。
void QRhiCommandBuffer::beginExternal()
アプリケーションが、グラフィックスAPI関数を直接呼び出して現在のパスのコマンドバッファにコマンドをエンキューしようとする前に呼び出されます。
注意: この関数は、beginPass() またはbeginComputePass() でインテントが前もって宣言されている場合にのみ使用できます。したがって、この関数は、パス記録がQRhiCommandBuffer::ExternalContent を指定して開始された場合にのみ呼び出される必要があります。
Vulkan、Metal、または Direct3D 12 では、nativeHandles() を介してネイティブコマンドバッファまたはエンコーダオブジェクトを照会し、それらにコマンドをエンキューできます。OpenGLまたはDirect3D 11では、(デバイス)コンテキストはQRhi::nativeHandles ()から取得できます。しかし、QRhiCommandBuffer の状態が最新であることを保証しなければ、このようなことは決して行ってはならない。したがって、beginExternal()とendExternal()の間に、外部から追加されたコマンドの記録をラップする必要がある。概念的には、これはQPainter のbeginNativePainting() およびendNativePainting() 関数と同じである。
特にOpenGLの場合、この関数には追加のタスクがある:それは、コンテキストが現在のスレッドでカレントになっていることを確認することである。
注意: beginExternal()が呼び出されると、endExternal()が呼び出されるまで、QRhiCommandBuffer 上で他のレンダーパス固有の関数(set*
またはdraw*
)を呼び出してはならない。
警告 バックエンドによっては、beginExternal() -endExternal() ブロックの内部で、QRhiCommandBuffer::nativeHandles() から、プライマリとは異なるネイティブ・コマンド・バッファ・オブジェクトを返すことがある。したがって、beginExternal()を呼び出した後、ネイティブコマンドバッファオブジェクトに(再)問い合わせることが重要である。実用的には、これは、例えばVulkanでは、外部で記録されたVulkanコマンドが(VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BITを持つ)セカンダリコマンドバッファに配置されることを意味します。nativeHandles() は、begin/endExternal の間に呼び出されると、このセカンダリコマンドバッファを返します。
endExternal() およびnativeHandles()も参照 。
void QRhiCommandBuffer::beginPass(QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
レンダーターゲットrt をターゲットとする新しいレンダーパスの開始を記録する。
resourceUpdatesNULLでない場合、コミットされ、その後リリースされるリソース更新バッチを指定します。
レンダーターゲットの色と深度/ステンシルバッファは通常クリアされる。クリア値はcolorClearValue とdepthStencilClearValue で指定される。例外は、レンダーターゲットがQRhiTextureRenderTarget::PreserveColorContents および/またはQRhiTextureRenderTarget::PreserveDepthStencilContents で作成された場合です。この場合、クリア値は無視されます。
注意: 保存されたカラーまたは深度コンテンツを有効にすると、基 盤となるハードウェアによってはパフォーマンスが低下します。タイルアーキテクチャを持つモバイル GPU は、タイルバッファに以前のコンテンツを再読み込みする必要がないため、メリットがあります。同様に、QRhiTexture をデプスバッファとするQRhiTextureRenderTarget は、QRhiRenderBuffer よりも効率的ではありません。なぜなら、デプステクスチャを使用するとデータを書き出す必要が生じますが、レンダーバッファではその必要がないからです(API がレンダーバッファからのサンプリングや読み込みを許可しないため)。
Note: パス間でステートやリソースバインディングが持続すると仮定しないでください。
注 :QRhiCommandBuffer のset
とdraw
関数は、パスの内部でのみ呼び出すことができます。また、setGraphicsPipeline ()を除き、これらの関数は、コマンドバッファにパイプラインセットがすでに設定されていることを想定しています。バックエンドによっては、そうでない場合、不特定の問題が発生する可能性がある。
rt がQRhiTextureRenderTarget の場合、beginPass() は、レンダーターゲットから参照されるテクスチャとレンダーバッファオブジェクトが最新であるかどうかのチェックを実行する。これは、QRhiShaderResourceBindings に対してsetShaderResources() が行うことと同様である。QRhiTextureRenderTarget::create() 以降にアタッチメントのいずれかが再構築されていた場合、rt で create() が暗黙的に呼び出される。したがって、rt にQRhiTexture カラーアタッチメントtexture
があり、テクスチャを異なるサイズにする必要がある場合、以下のようにすることが有効である:
QRhiTextureRenderTarget *rt = rhi->newTextureRenderTarget({ { texture } }); rt->create(); // ... texture->setPixelSize(new_size); texture->create(); cb->beginPass(rt, colorClear, dsClear); // this is ok, no explicit rt->create() is required before
flags 特定の高度な機能を制御できるようにします。よく使われるフラグの1つは です。このフラグは、この関数によって開始されるパス内で () が呼び出されるときは常に指定する必要があります。ExternalContents
beginExternal
endPass() およびBeginPassFlagsも参照のこと 。
void QRhiCommandBuffer::debugMarkBegin(const QByteArray &name)
指定されたデバッグ・グループを、指定されたname でコマンド・バッファに記録する。これは、RenderDocや XCodeなどのグラフィックデバッグツールで表示されます。グループ化の終了はdebugMarkEnd() で示される。
注: QRhi::DebugMarkers がサポートされていないか、QRhi::EnableDebugMarkers が設定されていない場合は無視される。
注: パスの内側と外側の両方で、フレーム内の任意の場所で呼び出すことができます。
void QRhiCommandBuffer::debugMarkEnd()
デバッググループの終了を記録する。
注: QRhi::DebugMarkers がサポートされていないか、QRhi::EnableDebugMarkers が設定されていない場合は無視される。
注 : パスの内外を問わず、フレーム内の任意の場所で呼び出すことができる。
void QRhiCommandBuffer::debugMarkMsg(const QByteArray &msg)
デバッグメッセージmsg をコマンドストリームに挿入する。
注 :QRhi::DebugMarkers がサポートされていないか、QRhi::EnableDebugMarkers が設定されていない場合は無視される。
注 : バックエンドによっては、debugMarkMsg() はパスの内部でのみサポートされ、パスの外部で呼び出されると無視されます。その他のバックエンドでは、フレーム内の任意の場所に記録されます。
void QRhiCommandBuffer::dispatch(int x, int y, int z)
x 、y 、およびz は、対応するディメンジョンのローカル・ワークグループの数を指定します。
注意: この関数は、計算パスの内部、つまりbeginComputePass() とendComputePass() 呼び出しの間にのみ呼び出すことができます。
注: x 、y 、z は、実行時に基礎となるグラフィックス API 実装からの制限に適合する必要があります。最大値は通常65535である。
注意: ローカルワークグループサイズも制限される可能性があるので注意し てください。これはシェーダで指定されます(例:layout(local_size_x = 16, local_size_y = 16) in;
)。たとえば、OpenGL では、1 つのローカルワー クグループ(local_size_x
、local_size_y
、local_size_z
の積)内の呼び出し数の仕様で義務付けられた最小値は 1024 ですが、OpenGL ES(3.1)では 128 になる可能性があります。つまり、上記の例は、OpenGL ESの実装によっては、呼び出し数が256であるため拒否される可能性がある。
void QRhiCommandBuffer::draw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0)
インデックスを持たない描画を記録する。
頂点数はvertexCount で指定する。インスタンス描画の場合は、instanceCount に 1 以外の値を設定する。firstVertex は、最初に描画する頂点のインデックスである。複数のインスタンスを描画する場合、最初のインスタンス ID はfirstInstance で指定します。
注: firstInstance はサポートされていない場合があり、QRhi::BaseInstance 機能がサポートされていないと報告された場合は無視されます。その場合、最初の ID は常に 0 になります。
void QRhiCommandBuffer::drawIndexed(quint32 indexCount, quint32 instanceCount = 1, quint32 firstIndex = 0, qint32 vertexOffset = 0, quint32 firstInstance = 0)
インデックス付き描画を記録する。
頂点数はindexCount で指定します。firstIndex はベースインデックスです。インデックスバッファ内の有効オフセットは、indexOffset + firstIndex * n
で指定します。n
は、インデックス要素のタイプに応じて 2 または 4 になります。indexOffset
は、setVertexInput() で指定します。
注意: インデックス・バッファの有効オフセットは、いくつかのバックエンド(例えばMetal)では4バイト・アライメントでなければならない。これらのバックエンドでは、NonFourAlignedEffectiveIndexBufferOffset 機能はサポートされていないと報告されます。
インスタンス描画の場合は、instanceCount に 1 以外の値を設定してください。複数のインスタンスを描画する場合、最初のインスタンス ID はfirstInstance で指定します。
注: firstInstance はサポートされていない可能性があり、QRhi::BaseInstance 機能がサポートされていないと報告された場合は無視されます。その場合、最初のIDは常に0となります。
vertexOffset ( とも呼ばれる) は符号付き値で、頂点バッファにインデックスを付ける前に要素インデックスに追加されます。この値は、 がサポートされていないと報告された場合は無視されます。base vertex
QRhi::BaseVertex
void QRhiCommandBuffer::endComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
現在の計算パスを終了するレコード。
resourceUpdatesNULLでない場合、コミットされ、リリースされるリソース更新バッチを指定します。
void QRhiCommandBuffer::endExternal()
外部から追加されたコマンドがコマンド・バッファまたはコンテキストに記録されると、呼び出される。
注: この関数を呼び出した後は、QRhiCommandBuffer の状態はすべて無効であると見なさなければなりません。外部コマンドの後にさらに描画コールが記録される場合は、パイプライン、頂点バッファ、インデックスバッファ、およびその他のステートを再度設定する必要があります。
beginExternal() およびnativeHandles()も参照 。
void QRhiCommandBuffer::endPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
現在のレンダーパスを終了する記録。
resourceUpdatesNULLでない場合は、コミットされた後に解放されるリソース更新バッチを指定します。
beginPass()も参照 。
double QRhiCommandBuffer::lastCompletedGpuTime()
QRhi を作成する際にQRhi::EnableTimestamps が有効になっていた場合、最後に利用可能だったタイムスタンプを秒単位で返します。 この値は、最後に完了したフレームの GPU 上の経過時間を示します。
注: QRhi::Timestamps 機能がサポートされていると報告されていない場合、またはQRhi::EnableTimestamps がQRhi::create() に渡されていない場合は、0 以外の結果を期待しないでください。一部のグラフィックスAPI(Metal)では、余分な操作(タイムスタンプクエリ)を行わなくてもタイミングを取得できるため、これには例外があります。しかし、ポータブルアプリケーションは、それが必要だとわかっているときは、常に意識的にタイムスタンプの収集を選択し、それに応じてこの関数を呼び出す必要があります。
その精度と粒度はQtによって制御されないことが多く、基盤となるグラフィックスAPIとその実装に依存するため、値の解釈には注意が必要です。特に、異なるグラフィックスAPIやハードウェア間で値を比較することは推奨されませんし、無意味かもしれません。
フレームがbeginFrame() とendFrame() で記録された場合、つまりスワップチェーンで記録された場合、タイミング値はおそらく非同期で利用可能になります。そのため、返される値は0(最初の1~2フレームなど)であったり、ある前のフレームを参照した最後の既知の値であったりします。また、ウィンドウのサイズを変更した場合など、特定の条件下では値が再び0になることもあります。利用可能な最新の値は beginFrame() で取得され、beginFrame() が返ると、この関数で問い合わせ可能になることが期待できます。
注意: 値が直前 (currently_recorded - 1
) のフレームを指していると思わないでください。currently_recorded - 2
やcurrently_recorded - 3
を参照することもあります。正確な動作は、グラフィックスAPIとその実装に依存します。
一方、オフスクリーン・フレームでは、endOffscreenFrame() が返ると、返される値は最新のものになります。これは、オフスクリーン・フレームは GPU のパイプライン処理を減らし、コマンドが完了するのを待つからです。
注意: これは、スワップチェーンフレームとは異なり、オフスクリーンフレームでは、返される値はちょうど投入され完了したフレームを指すことが保証されていることを意味します。(この関数が endOffscreenFrame() の後、次の beginOffscreenFrame() の前に呼ばれると仮定して)
プラットフォームによる GPU 周波数のスケーリングと GPU クロックの変化の結果に注意 してください。たとえば、Windows では、最近のグラフィックカードでは、同じような、あるいは同じワークロードでフレームを送信しても、返されるタイミングがフレーム間でかなり広い範囲で異なることがあります。これは一般的に言って、Qtが制御したり解決したりする範囲外です。しかし、D3D12バックエンドは、環境変数QT_D3D_STABLE_POWER_STATE
がゼロ以外の値に設定されるたびに、ID3D12Device::SetStablePowerState() を自動的に呼び出します。これは結果を大きく安定させることができます。また、特にオフスクリーンフレームが関係する場合など、QElapsedTimer を介して測定される CPU 側のタイミングに、重要でない影響を与えることもあります。
注意: QT_D3D_STABLE_POWER_STATE
を設定したアプリケーションを本番環境に出荷しないでください。詳しくはWindows APIドキュメントを参照してください。
QRhi::Timestamps およびQRhi::EnableTimestampsも参照して ください。
const QRhiNativeHandles *QRhiCommandBuffer::nativeHandles()
QRhiVulkanCommandBufferNativeHandles のような、バックエンド固有のQRhiNativeHandles サブクラスへのポインタを返します。基盤となるネイティブリソースの公開がバックエンドでサポートされていない、あるいはバックエンドに適用できない場合、返される値はnullptr
となります。
QRhiVulkanCommandBufferNativeHandles 、QRhiMetalCommandBufferNativeHandles 、beginExternal()、endExternal()も参照 。
[override virtual]
QRhiResource::Type QRhiCommandBuffer::resourceType() const
を参照してください:QRhiResource::resourceType() const.
リソースタイプを返します。
void QRhiCommandBuffer::resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates)
リソースの更新をコミットすることが必要な場合や、レンダーパスを開始しない方が便利な場合があります。この関数をresourceUpdates で呼び出すと、beginPass() 呼び出しにresourceUpdates を渡す代わりに使用できます (リードバックの場合はendPass() が一般的です)。
注: パスの内部で呼び出すことはできません。
void QRhiCommandBuffer::setBlendConstants(const QColor &c)
アクティブブレンド定数をc に設定することを記録する。
これは、バインドパイプラインにQRhiGraphicsPipeline::UsesBlendConstants が設定されている場合にのみ呼び出すことができる。
void QRhiCommandBuffer::setComputePipeline(QRhiComputePipeline *ps)
新しいコンピュートパイプラインの設定を記録するps 。
注: この関数は、setShaderResources() またはdispatch() コマンドをコマンドバッファに記録する前に呼び出す必要があります。
注: QRhi はパス内の不要な呼び出しを最適化するため、アプリケーション側でこの関数の呼び出しを避けるために最適化しすぎる必要はない。
注意: この関数は、計算パスの内部、つまりbeginComputePass() とendComputePass() の呼び出しの間にのみ呼び出すことができます。
void QRhiCommandBuffer::setGraphicsPipeline(QRhiGraphicsPipeline *ps)
新しいグラフィックス・パイプラインの設定を記録するps 。
注意 :この関数は、コマンドバッファに他のset
またはdraw
コマンドを記録する前に呼び出す必要があります。
注: QRhi はパス内の不要な呼び出しを最適化するため、アプリケーション側でこの関数の呼び出しを避けるために最適化しすぎる必要はありません。
注: 新しいグラフィックスパイプラインps は、有効なポインタでなければなりません。
void QRhiCommandBuffer::setScissor(const QRhiScissor &scissor)
scissor で指定されたアクティブシザー矩形の設定を記録します。
これは、バインドパイプラインにUsesScissor が設定されている場合にのみ呼び出すことができます。アクティブなパイプラインにフラグが設定されると、シザーテストが有効になるため、シザー矩形を提供する必要があるため、この関数を呼び出す必要があります。
注意: QRhi はOpenGLスタイルのビューポート座標、つまりxとyが左下であることを想定しています。
void QRhiCommandBuffer::setShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr)
レコードは、1つまたは複数のシェーダステージに可視化される、ユニフォームバッファやテクスチャなどのシェーダリソースのセットをバインドします。
srb この場合、現在のグラフィックスまたはコンピュートパイプラインの関連 が使用されます。 が NULL でない場合、それは でなければなりません。つまり、レイアウト(バインディングの数、各バインディングのタイプとバインディング番号)は、パイプラインの create() を呼び出した時点でパイプラインに関連付けられていた と完全に一致しなければなりません。QRhiShaderResourceBindings srb layout-compatible QRhiShaderResourceBindings
一見不要に見える setShaderResources() 呼び出しが必須である場合があります。srb から参照されるリソースを再構築するとき、たとえばQRhiBuffer のサイズを変更し、その後にQRhiBuffer::create() が続く場合、これは関連するネイティブオブジェクト(Vulkan の場合はディスクリプタセットなど)が更新され、srb から参照されるQRhiBuffer,QRhiTexture,QRhiSampler オブジェクトをバックする現在のネイティブリソースを参照する場所です。この場合、setShaderResources() は、srb が前回の呼び出しと同じであっても呼び出されなければならない。
srb が NULL でない場合、パイプラインが create() でビルドされたQRhiShaderResourceBindings オブジェクトは、いかなる形でもアクセスされないことが保証されます。実際、この時点でも有効である必要はありません。create() の後でパイプラインに関連する srb を破棄し、代わりにすべての setShaderResources() 呼び出しで別のlayout compatible を明示的に指定することは有効です。
dynamicOffsets QRhiShaderResourceBinding::uniformBufferWithDynamicOffset() を介して に関連付けられたユニフォームバッファのバッファオフセッ トを指定することができます。これは、 自体でオフセットを提供するのとは異なります。動的オフセットは、異なるオフセットごとに新しい を構築する必要がなく、(該当する場合はバックエンドを含む)基礎となる記述子の書き込みを回避できるため、より効率的である可能性があります。 の各要素は、 - のペアである。 は、 の要素数を指定する。srb srb QRhiShaderResourceBindings dynamicOffsets binding
offset
dynamicOffsetCount dynamicOffsets
注意 :dynamicOffsets のオフセットはすべて、QRhi::ubufAlignment()から返される値に バイトアラインされていなければならない。
注意 :バックエンドによっては、サポートされるダイナミック・オフセットの数を 制限している場合がある。8を超えるdynamicOffsetCount の使用は避けること。
注: QRhi は(上記の条件を考慮して)パス内の不要な呼び出しを最適化するため、アプリケーション側でこの関数の呼び出しを避けるために最適化しすぎる必要はない。
注意: この関数は、レンダリングパスまたは計算パスの内部、つまりbeginPass() とendPass() の間、またはbeginComputePass() とendComputePass() の間でのみ呼び出すことができる。
void QRhiCommandBuffer::setStencilRef(quint32 refValue)
アクティブステンシル参照値をrefValue に設定することを記録する。
これは、バウンドパイプラインにQRhiGraphicsPipeline::UsesStencilRef が設定されている場合にのみ呼び出すことができる。
void QRhiCommandBuffer::setVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16)
頂点入力バインディングを記録します。
後続のdrawIndexed() コマンドで使用されるインデックス バッファは、indexBuf 、indexOffset 、indexFormat で指定されます。インデックス描画が不要な場合は、indexBuf を NULL に設定できます。
頂点バッファのバインディングはバッチ処理されます。startBinding は最初のバインディング番号を指定します。bindings startBinding + i
i
は のインデックスです。 の各要素は、 とオフセットを指定する。bindings bindings QRhiBuffer
注意: バックエンドによっては、頂点バッファのバインディング数を制限している場合があります。8より大きいbindingCount の使用は避けてください。
ほとんどのバックエンドでは、同じパスでの余分な頂点入力とインデックスの変更は自動的に無視されるため、アプリケーションはこの関数の呼び出しを避けるために過剰に最適化する必要はありません。
簡単な例として、2 つの入力を持つ頂点シェーダを考えてみましょう:
layout(location = 0) in vec4 position; layout(location = 1) in vec3 color;
このシェーダでは、 を呼び出すことができます。このシェーダ用のQRhiGraphicsPipeline は、入力レイアウトを使用して作成できます:
QRhiVertexInputLayout inputLayout; inputLayout.setBindings({ { 5 * sizeof(float) } }); inputLayout.setAttributes({ { 0, 0, QRhiVertexInputAttribute::Float2, 0 }, { 0, 1, QRhiVertexInputAttribute::Float3, 2 * sizeof(float) } });
ここではバッファバインディング(バインディング番号 0)が 1 つあり、それを参照する入力が 2 つあります。パスを記録するとき、パイプラインが設定されると、頂点バインディングは次のように単純に指定できます。vbuf は、すべてのインターリーブされた位置+色データを持つQRhiBuffer であると仮定します:
const QRhiCommandBuffer::VertexInput vbufBinding(vbuf, 0); cb->setVertexInput(0, 1, &vbufBinding);
void QRhiCommandBuffer::setViewport(const QRhiViewport &viewport)
viewport で指定されたアクティブビューポート矩形の設定を記録します。
基礎となるグラフィックスAPIが常にシザリングを有効にしているバックエンドでは、アクティブなQRhiGraphicsPipeline がUsesScissor セットされていないときはいつでも、この関数はビューポートに一致するようにシザーもセットします。
注意: QRhi はOpenGLスタイルのビューポート座標、つまりxとyが左下であることを想定しています。
本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。