displaylist がよくわかりません。たとえば、複雑な光でシーンを描画したい場合、シーン内のオブジェクトで使用されるマテリアルを変更する場合があります。マテリアルの設定速度が遅いかもしれないので、マテリアルの定義をdisplaylistに入れることができます。では、displaylist を使用する利点は何ですか?
1 に答える
表示リストは、基本的にマクロ レコーダー/プレーヤーです。表示リストをコンパイルするとき、OpenGL 実装は、送信されたすべてのコマンドを 1 つのオブジェクトに記録します。残念ながら、表示リストは操作が少し面倒です。たとえば、表示リストはテクスチャ オブジェクトに渡されたデータを格納します (テクスチャ オブジェクトが導入される前の 1992 年頃の OpenGL-1.0 でテクスチャ ストアとして使用されていました) が、頂点配列を介して描画されたジオメトリ データは格納されません。 .
ディスプレイ リストを介して得られるパフォーマンスの向上は、(GPU 側の) 頂点配列が許可するように、多数の即時モード呼び出しをバッチ処理できる可能性があるためです。Vertex Buffer Objectsが利用可能になったので、このような表示リストの使用は廃止されました。これは 2000 年頃のことでした。ディスプレイ リストの残りの唯一の使用法は、OpenGL の状態設定をカプセル化することでした。これは便利でした。固定関数パイプラインの状態を記録しておく設定は非常に面倒だったからです。OpenGL が完全にシェーダー ベースになって以来、固定関数の状態の多くも時代遅れになりました。今日では、膨大な数の OpneGL ステート コール (または 1 つの glCallLists) を呼び出して行ったことは、目の前のタスクに適したシェーダー プログラムを選択するだけで置き換えられます。
表示リストが完全に廃止されて以来、実行可能なパフォーマンスの向上はありません。
OpenGL 側の行列演算 (glLoadIdentity、glTranslate、glRotate など) が GPU によって実行されないことも注目に値します。マトリックスはドライバーによって準備され、GPU にアップロードされます。表示リストは、準備されたマトリックスを保存し、アップロードするだけです。しかし、帯域幅とパフォーマンスの観点からは、glUniform / glLoadMatrix を自分で呼び出しても、表示リストでそのコードパスをトリガーしても違いはありません。そのため、クロノスは合理的なことを行い、最新の OpenGL バージョンとバリアントからディスプレイ リストを削除しました。
TL;DR:表示リストは、Vertex Buffer Objects を使用してジオメトリを高速メモリに格納したり、OpenGL 状態のより大きなセットを単一の名前にコンパイルしたりするのに使用できない便利なツールでした。最新の OpenGL では、ディスプレイ リストはもはや利点を提供せず、ドライバーのサイズと複雑さを増大させるだけであるため、ディスプレイ リストは最新の OpenGL バリアントから削除されました。