0

OpenGL で線、四角形、立方体などをすばやく簡単にレンダリングするための便利なメソッドを含む小さなユーティリティ クラスを自分用に作成しました。これまで、私はほぼ完全に即時モードを使用していたので、OpenGL の他の側面の学習に集中することができました。VBO の使用に切り替えるのが賢明なようです。ただし、ユーティリティ クラスなど、これまで使用してきたのと同じ機能の多くを維持したいと考えています。これらの単純な即時モード呼び出しを多用途の VBO システムに変換する良い方法はありますか?

LWJGLを使用しています。

4

1 に答える 1

2

自分のコードを begin..end ブロックから変換し、他の人にも教えたので、これをお勧めします。

あなたのユーティリティクラスはほとんどが静的メソッドであると想定しています。この点からその点まで線を引きます。

最初のステップは、個々の描画操作で各属性の VBO を作成することです。glBegin..glEnd ブロックを、各頂点属性 (座標、色、tex 座標など) の配列 (実際には ByteBuffer) を作成するコードに置き換えます。以前は glEnd だったものの後、ByteBuffers を glBufferData を使用して VBO にコピーします。次に、glEnableClientState、glBindBuffer、glVertex|Color|whateverPointer 呼び出しのチャンクで属性を設定します。glDrawArrays を呼び出して実際に何かを描画し、最後にクライアントの状態を復元して VBO を削除します。

さて、これは適切な OpenGL コードではなく、恐ろしく非効率的で浪費的です。しかし、うまくいくはずです。書くのはかなり簡単で、一度に 1 つのメソッドを変更できます。

また、あまり描画する必要がない場合、最新の GPU は非常に高速であるため、効率が悪いことを気にしないかもしれません。

2 番目のステップは、VBO の再利用を開始することです。初期化時または初回使用時に、可能な属性ごとにクラスで 1 つの VBO を作成します。描画コードは引き続き ByteBuffer データ配列を作成してコピーしますが、VBO は削除しません。

OpenGL 4 に移行し、シェーダーを使用している場合の 3 番目のステップは、glVertexPointer を glVertexAttribPointer(0、glColorPointer を glVertexAttribPointer(1) などに置き換えることです。また、初期化時に VBO とともに頂点配列オブジェクトを作成する必要があります。 (各描画操作で色や tex 座標などが必要かどうかに応じて、attrib ポインターを個別に有効/無効にする必要があります。)

そして、プログラムの他の場所で変更が必要になる最後のステップは、メソッドではなく 3D の「オブジェクト」を使用することです。ユーティリティ クラスには描画メソッドが含まれなくなります。代わりに、線、四角形、または立方体オブジェクトを作成して描画します。これらの各オブジェクトには、(おそらく) 独自の VBO があります。これは手間がかかりますが、多くの 3D ジオメトリがフレームごとに変化しない一般的なケースでは、本当に効果があります。ただし、P1 から P2 への線を描画するための各メソッド呼び出しを l = new Line3D(P1, P2) のようなものに置き換えるという、より「無駄な」アプローチから始めることもできます。l.draw()。

お役に立てれば。

于 2014-02-02T23:52:23.250 に答える