1

私は小さなゲームに取り組んでいます (OS X Lion、Xcode 4、Objective-C / C++、Cocoa、OpenGL を使用)。それはかなり単純な概念です。2 次元配列内を動き回るオブジェクトがいくつかあります。今、ゲーム用の OpenGL GUI を書きたいと思っています。

私がしたことは、配列を調べて、オブジェクトの種類に依存するテクスチャを使用して、その特定の位置にある各オブジェクトの立方体を描画することでした。もちろん、私の最初の素朴な実装は少し CPU 集約的だったので、次のステップはテクスチャ アトラスを実装することでした。頂点がたくさんあるので、まだ改善の余地がたくさんあります。

VBO と DisplayList の方がはるかに高速であると読みました。いくつかのチュートリアルに取り組みましたが、実際の動的なゲーム環境での実装についてまだ多くの質問があります。

ゲームオブジェクトの表示リストをコンパイルするとします。特定の位置に配置したい場合は、glTranslatef() を使用する必要があります。しかし、glTranslatef() の多くは、非常に CPU を集中的に使用する可能性があります。どうすれば対処できますか?もちろん、可能なすべての位置で各種類のゲームオブジェクトの表示リストを作成することもできますが、それは非現実的であり、ゲームがタイルベースであるためのみ機能します...

VBO も同じ問題を抱えているようです。もちろん (少なくとも私の理解では) 頂点のメッシュ全体を作成し、配列を調べて、すべてのオブジェクトについて、オブジェクトの位置に関連付けられた頂点の立方体をレンダリングすることができます。しかし、頂点のメッシュ全体から特定の立方体にテクスチャを適用する方法がわかりません。メッシュ内のキューブ面ごとにテクスチャ座標を作成する必要がありますか?それとも、キューブの 6 つの面すべてに対してテクスチャ座標を作成するだけで十分でしょうか?

4

1 に答える 1

1

通常、表示リストと VBO は単純なジオメトリには役立ちません。青い OpenGL ブックから正しく思い出すと、速度が低下することさえあります。

表示リストは、OpenGL 1.x では「最高の状態」でしたが、VBO の導入によりレガシー機能と見なされていました。

OpenGL のターゲット バージョンがわかっていると助かります。OpenGL 1.x でイミディエイト モードを使用する場合、「カメラ マトリックス」を設定し (OpenGL にはカメラ マトリックスがありません。その転置をマトリックス スタックに残すだけです)、レンダー ループ内の各モデルのマトリックスをプッシュおよびポップします。

OpenGL 2.x または 1.xARB 拡張機能を使用すると、変換をユニフォーム マトリックスに配置してから、各モデルのユニフォームを更新できます。ユニフォームの更新も遅いので、これはあまり役に立ちません。

あなたができる最善のことは、OpenGL にシェーダーの (セットの) 属性マトリックスを提供することだと思います。これにより、すべてのデータが一度に転送されるため、CPU のオーバーヘッドが削減されます。技術的な実装の詳細については考えられませんが、属性は頂点ごとにあると思うので、変換を配置するために使用した他のバッファーのどこを見るかのインデックスを渡す必要があります。ほとんどのモデルには、変換を設定する時間よりも多くのジオメトリとテクスチャの情報が含まれているため、これを行ったことはありません。

そうは言っても、VBO を使用して再設計し、属性に変換を提供することは、CPU 使用率を 8% 向上させるためにおそらく大変な作業です。おそらく 2.0 GHz コア 2 デュオの 1 つのコアで 8%

編集

ユニフォーム バッファ オブジェクトは、私が本当に欲しかったものです。おそらく均一なブロックレイアウトのためです。ブルー ブック (およびおそらくオレンジ ブック) と google に詳細があります。

于 2011-11-04T21:07:14.383 に答える