0

私が使用するとき:

glUseProgramObjectARB(program);
  DrawCube();
glUseProgramObjectARB(0);

関数DrawCube()は次のとおりです。

DrawCube(){
  glBegin(GL_QUADS);
    glVertex3f(... data ...);
    glVertex3f(... data ...);
    glVertex3f(... data ...);
    glVertex3f(... data ...);
  glEnd();
}

私の質問は次のとおりです。この機能はグラフィックカードで実行されますか?ダイレクトモード[glBegin()--glEnd()]を使用する場合、またはVBOを使用する場合、より高速ですか?

4

3 に答える 3

3

このリンクのテストでは、固定モードとプログラマブルの使用に顕著なパフォーマンスの違いがないことが示されていますが、私はそれを「購入」していないと言わざるを得ません。テスターはベンチマークのソース コードを示していません。 「クリーン」ではありません。私の個人的な経験から言えば、古い (GL 2.1) で書かれた古いエンジンがあり、それを完全にプログラム可能な GL4.2 パイプラインに書き直しました。少なくとも 80% のパフォーマンスが得られました。ブーストと一部のモジュールでは、オフスクリーン FBO レンダリングなどのパフォーマンスが 300% 向上しました。また、エフェクトや後処理に触れていません。これらのほとんどは、事実上遅いか、プログラム可能なパイプラインを使用しないと不可能です。

また、固定パイプラインとプログラマブル パイプラインについて説明しているこのリンクもご覧ください。

于 2013-01-20T09:58:32.197 に答える
2

シェーダーの使用とジオメトリの送信に使用される方法は直交しています。つまり、一方が他方とは何の関係もありません。

即時モードの大きな問題は、これらの小さな呼び出しがすべて大量のコードを介して行われるため、CPU を占有することです。2 つ目の問題は、即時モードとクライアント側頂点配列の両方がシステム バス帯域幅によって制限されることです。これを数値で表すと、16 レーンの PCI-Express Gen 3 は約 15GiB/s を転送できます (実際のアプリケーションでは、10GiB/s に近い値です)。GPU メモリは、少なくとも 10 倍の帯域幅で接続されます。VBO^1 を使用すると、数バイト (glDrawElements コマンドが変換するものは何でも) を送信するだけで、GPU に大量のジオメトリを描画させることができます。

シェーダー OTOH は GPU 上で実行される小さなプログラムで、ジオメトリ データを画面上の位置に変換し、ピクセル値で埋めます。シェーダーは、データが GPU に送信された方法を気にしません。また、シェーダーを「使用しない」からといって、GPU で何も起こらないわけではありません。1 つには、構成された固定機能の状態に一致するようにその場で記述されたデフォルトのシェーダーがあります。そうでなかったとしても、シェーダーを使用しないことが GPU の負担になると考える理由は何ですか?


[1] 頂点配列オブジェクトは、一連の VBO とそれらがバインドされている頂点属性を収集する、抽象的な状態の保持者にすぎません。

于 2013-01-20T12:09:21.827 に答える