0

openGL で 2D ゲームを作成しており、静的オブジェクトのリストがあります。これまでのところ、それらをループして部屋に引き込んでいますが、一部の大きな部屋には最大2000個あり、速度が重要であるため、それらをすべて一緒に「焼き付け」、決して更新しない方法を見つけたいと思いますその後、それらを描画ループに入れます。

どうすればこれを行うことができますか?パフォーマンス、メモリ使用量、GPU RAM 使用量などの点で最善の方法は何ですか?

oGL 2 を使用したいのですが、oGL 3+ を検討しています。

4

2 に答える 2

1

最も簡単な方法は、これらのオブジェクトのすべてのデータを GPU に移動して、レンダリング コマンドが GPU メモリからメモリを直接フェッチするようにすることです。これは、VBO または DisplayList (「古い」OpenGL 2.0 以前) を使用するだけで実行できます。

内部にすべてのコマンドを「パック」できるため、おそらく DisplayList ソリューションが最も効率的です... VBO を使用すると、ジオメトリ データのみをパックでき、マテリアルはフレームごとにセットアップする必要があります。関連トピック: インスタンス化 (ただし、GL 3+ を使用する必要があります)。

もう 1 つの方法は、それらをテクスチャにレンダリングして、単純な Sprit として表示することです。この手法は「詐欺師」と呼ばれます。ここにいくつかの情報があります:真の詐欺師.

別のオプション: 環境をキューブ マップにレンダリングします。カメラから遠く離れたオブジェクト (丘、トライなど) では機能する可能性がありますが、部屋では奇妙に見える可能性があります。

于 2012-05-17T08:58:11.467 に答える
0

最初のオプション: オブジェクトの単一メッシュを作成します。たとえば、表示されているオブジェクトでインデックス配列を動的に更新できます。この場合、使用するテクスチャがアトラスにあることが非常に重要です。シェーダとテクスチャを共有できない場合、この手法による効果はあまりありません。この方法を組み合わせて、マテリアルごとにテクスチャをグループ化し、単一の描画呼び出しを使用してレンダリングすることができます。たとえば、最初の描画呼び出し - 1 つのテクスチャで 100 本の木をレンダリングし、100 個の雲の後に 600 個のリンゴをレンダリングします。

別のオプションとして、オブジェクトが静的である場合、FBO を使用してそれらすべてをテクスチャにレンダリングできます。これは、オブジェクトが背景を好む場合に適用できます。たとえば、銀河の空間にランダムな星 (1000 個) をレンダリングします。

于 2012-05-17T09:17:25.183 に答える