多くのパーティクルのすべての頂点データを1つの配列に結合しました。独自の翻訳を維持する方法で、これらすべてのパーティクルをバッチ描画するにはどうすればよいですか?
私はこれを行う方法についてとても混乱しています。この問題についてはすでに2つの投稿を作成しましたが、まだ混乱しています。現在OpenGLES1.1を使用していますが、独自の平行移動や回転などを使用してパーティクルのバッチレンダリングを実際に実行できる場合は、2.0にアップグレードする予定です。
2つの投稿は次のとおりです。
- OpenGL ES-さまざまなアルファ、回転、スケールを使用して500以上のパーティクルをバッチレンダリングする方法は?
- ゲームの速度を落とさずに、iPhone OpenGL ESパーティクルシステムで1000以上のパーティクル(独自の回転、スケール、アルファ付き)を描画するにはどうすればよいですか?
どちらも高レベルのアプローチを説明していますが、各パーティクルの平行移動、回転、スケールがフレームごとに変わるこのパーティクルのバッチをレンダリングする方法を知る必要があります。あなたの答えがCPUでの変換を計算することである場合は、この例を示してください。
現在、実装で頂点配列オブジェクトを使用しています。最高のパフォーマンスを得るには、VBOを使用する必要があることを理解しています。VBOを実装しますが、最初にバッチ処理を実装したいと思います。バッチ処理が正常に完了したら、VAOをVBOに変更します。したがって、この質問の焦点は、VAOを使用してこれをどのように達成するかです。
バッチ処理前のコードは次のとおりです。モデルビューマトリックスに新しいマトリックスをプッシュし、レンダリングされている現在のアクターに応じて変換、回転、スケーリング、アルファ化し、レンダリングされている現在のアクターの頂点とテクスチャコードを描画します。
glPushMatrix();
glTranslatef(translation.x, translation.y, translation.z);
// rotation
glRotatef(rotation.x, 1, 0, 0);
glRotatef(rotation.y, 0, 1, 0);
glRotatef(rotation.z, 0, 0, 1);
// scale
glScalef(scale.x, scale.y, scale.z);
// color and alpha
glColor4f(1.0, 1.0, 1.0, alpha);
glVertexPointer(2, GL_FLOAT, 0, aSprite.vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texturedQuad.textureCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopMatrix();
ここで、すべてのパーティクルアクターの頂点とtextureCoordsをバッチ配列に結合したので、modelviewマトリックスに新しいマトリックスをプッシュし、それらのアクターの頂点とtextureCoordsを適切な変換、回転、スケールで描画したいと思います。 、アルファなど。
だから私の推測では、それは次のように見えるでしょう:
static GLFloat verticesBatched[appropriate_length] = ...; // I have a method to populate this array based on the Actors to render
static GLFloat textureCoordsBatched[appropriate_length] = ...; // I have a method to populate this array based on the Actors to render
glPushMatrix();
// perform CPU matrix manipulation to manually translate, rotate, and scale all vertices
glVertexPointer(2, GL_FLOAT, 0, verticesBatched);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, textureCoordsBatched);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopMatrix();
有効な答えは、この質問の解決策を明確に示すコード例を含むものです。