3

私は OpenGL を使用しており、プログラムでさまざまな幾何学的形状 (正方形、三角形など) を各オブジェクトに異なるテクスチャで描画しています。

VBO とシェーダーを使用してレンダリングの実行をテストしたところ、オブジェクトごとに VBO を作成するのにうまく機能しました。この問題は、大量のオブジェクト (150 から 200 の間) の場合に発生します。これは、関数の呼び出しが非常に多いことを意味しますglDrawElements()

glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

最善の方法は、描画するすべての頂点 (頂点、テクスチャ座標、インデックスなど) を含む単一の VBO を作成することであることがわかりました。

これに関する問題は、VBO がすべてのジオメトリを 1 回描画するため、オブジェクトごとに異なるテクスチャを使用できないことです。

質問は..必要なことを実行するための最良の方法(最適な方法)は何ですか?glBegin ()/glEnd ()またはとしてすでに廃止された関数またはメソッドを使用せずにglDrawArrays ()(私はオープンGL 3.0以降で作業しています)。

PD: C++ で OpenGL を使用しています。

4

2 に答える 2

4

最初に 1 つのテクスチャで VBO をレンダリングし、次に別のテクスチャでレンダリングする場合:

  1. 最初のテクスチャをバインドする
  2. VBO をレンダリングする
  3. 2 番目のテクスチャをバインドする
  4. VBO を再度レンダリングする

VBO の一部を 1 つのテクスチャで描画し、一部を別のテクスチャで描画する場合は、いくつかのオプションがあります。

  • VBO を 2 つの個別の VBO に分割し、別々にレンダリングします。
  • 両方のテクスチャを 1 つの大きなテクスチャに結合し、それに応じてテクスチャ座標を調整する、または
  • 配列テクスチャを使用し、シェーダーで正しいレイヤーを選択します。ターゲット ハードウェアでサポートされている場合、これがおそらく最良のオプションです。さらに柔軟性を高めるには、スパーステクスチャ配列を検討してください。
于 2013-09-17T19:54:38.680 に答える