数回描画してフレームごとにブレンドする必要がある巨大なメッシュ (100k の三角形) があります。メッシュの最初のパスの頂点シェーダー出力を再利用し、後のパスで頂点ステージをスキップすることは可能ですか? 頂点パイプラインとラスタライズのコストをいくらか節約したいと考えています。
対象の OpenGL 3.0 では、変換フィードバックなどの機能を使用できます。
数回描画してフレームごとにブレンドする必要がある巨大なメッシュ (100k の三角形) があります。メッシュの最初のパスの頂点シェーダー出力を再利用し、後のパスで頂点ステージをスキップすることは可能ですか? 頂点パイプラインとラスタライズのコストをいくらか節約したいと考えています。
対象の OpenGL 3.0 では、変換フィードバックなどの機能を使用できます。
最初に基本的な質問に答えてから、実際の質問に答えます。
はい、後で使用するために頂点変換の出力を保存できます。これを変換フィードバックと呼びます。OpenGL 3.x クラス以上のハードウェア (別名: DX10 ハードウェア) が必要です。
その仕組みは2段階。最初に、フィードバックに基づいた変数を持つようにプログラムを設定する必要があります。でこれを行いglTransformFeedbackVaryings
ます。これは、プログラムをリンクする前に、 などと同様の方法で行う必要がありますglBindAttribLocation
。
それが完了したら、バッファーを (変換フィードバック変数の設定方法を考慮して) GL_TRANSFORM_FEEDBACK_BUFFER
withglBindBufferRange
にバインドし、データが書き込まれるバッファーを設定する必要があります。次に、glBeginTransformFeedback でフィードバック操作を開始し、通常どおり続行します。プリミティブ クエリ オブジェクトを使用して、書き込まれたプリミティブの数を取得できます (後で で描画できますglDrawArrays
)。または、4.x クラスのハードウェア (または AMD 3.x ハードウェア、すべて ARB_transform_feedback2 をサポート) を使用している場合は、プリミティブの数を照会せずにレンダリングできます。それは時間を節約するでしょう。
さて、実際の質問ですが、実際のパフォーマンスを購入するのに役立つことはおそらくないでしょう。
地形を描いています。そして、地形は実際には変化しません。通常、1 つまたは 2 つの行列乗算があり、場合によっては法線を使用します (ただし、シャドウ マップをレンダリングしている場合は、それさえありません)。それでおしまい。
このような単純なシェーダーで 100,000 個の頂点を GPU に押し込むと、それらすべてをレンダリングする GPU の能力が飽和状態になる可能性が非常に高くなります。プリミティブなアセンブリ/セットアップでボトルネックになる可能性が高く、それ以上は速くなりません。
したがって、おそらくこれから多くのことを得るつもりはありません。フィードバックは通常、後で使用するために三角形データを生成するため (実質的に疑似計算シェーダー)、またはデュアル クォータニオンを使用したマトリックス パレット スキニングなどの複雑な変換の結果を保存するために使用されます。単純な行列の乗算と実行は、レーダー上ではほとんど問題になりません。
よろしければお試しいただけます。しかし、おそらく問題はないでしょう。一般に、最良の解決策は、なんらかの形式の遅延レンダリングを採用することです。これにより、オブジェクトをレンダリングする必要があるのは、オブジェクトがキャストするすべてのシャドウに対して 1 回 + X (X はシャドウ マッピング アルゴリズムによって決定されます) だけです。また、シャドウ マップにはさまざまな変換が必要なため、フィードバックからは何も得られません。