0

私の現在のレンダリングの実装は次のとおりです。

  • すべての頂点情報を三角形ではなく四角形として保存します
  • 三角形の場合は、最後の頂点を繰り返すだけです (つまりv0 v1 v2 v2)
  • lines_adjacencyジオメトリ シェーダーに関する頂点情報を渡す
  • 四角形か三角形かを確認し、次のように出力しますtriangle_strip

このルートを選択した理由は、ワイヤーフレーム シェーダーを実装していて、四角形を対角線なしで描画したかったからです。しかし、それ以来、私はその機能を破棄しました。

単純な描画に戻りGL_TRIANGLES、ジオメトリ シェーダーを式か​​ら除外する必要があるかどうかを考えています。しかし、それで考えさせられました...パフォーマンスの観点から、実際により効率的なものは何ですか?

  • 平均して、私のシーンは四角形と三角形が同じ量で構成されています。
  • すべての三角形で描画すると、四角形ごとに 6 つの頂点、三角形ごとに 3 つになります。
  • lines_adjacency で描画すると、クワッドごとに 4 つの頂点、三角形ごとに 4 つの頂点を意味します。
  • (これはインデックス付きの描画であるため、頂点バッファーは両方で同じサイズです)

したがって、頂点の比率は 9:8 (三角形 : lines_adjacency) です。

インデックス付きの描画では、各頂点が (インデックスごとに 1 回ではなく) 頂点シェーダーによって 1 回だけ処理されると仮定するのは正しいでしょうか? その場合、三角形の描画はより効率的になります (追加のジオメトリ シェーダー ステップを実行する必要がないため)。唯一の欠点は、インデックスが余分なメモリをわずかに消費することです。

次に、頂点がインデックスごとに 1 回処理される場合、頂点シェーダーがより集中的なライティング計算を実行している可能性がある一方で、ジオメトリ変換が非常に単純であることを考慮すると、lines_adjacency メソッドを使用してエッジを確認できます。

以上が私の質問の要約です: 頂点はインデックス付きの描画でどのように扱われるのでしょうか? また、単純なジオメトリ シェーダーを含めると、どのようなパフォーマンスへの影響が予想されるでしょうか?

4

1 に答える 1

1

ジオメトリ シェーダーは、このような状況では決して効率を改善しません。プリミティブ アセンブリ プロセスを複雑にするだけです。ジオメトリ シェーダーを使用すると、ポスト T&L キャッシュが当初の設計どおりに機能しなくなります。

頂点データをフェッチする必要がある場合、ジオメトリ シェーダーが頂点シェーダー ステージで変換された共有 (インデックス付き) 頂点を再利用することは事実ですが、ジオメトリ シェーダーは依然として一意の頂点セットを計算し、per-output-primitive を出力します

さらに、ジオメトリ シェーダーは可変数のデータ ポイントを出力できるため、他のシェーダー ステージとは異なります。ジオメトリ シェーダーを並列化することは、頂点やフラグメントを並列化することよりもはるかに困難です。ジオメトリ シェーダーには、実際に必要でない限り使用を提案できないほど多くのマイナス要素があります。

于 2013-11-29T21:52:36.170 に答える