5

PointSprites (Cocos2D ソースに触発された) で ParticleSystem を使用しています。しかし、OpenGL ES 2.0 の機能をどのように再構築するのだろうか

glEnable(GL_POINT_SPRITE_OES);
glEnableClientState(GL_POINT_SIZE_ARRAY_OES);
glPointSizePointerOES(GL_FLOAT,sizeof(PointSprite),(GLvoid*) (sizeof(GL_FLOAT)*2));
glDisableClientState(GL_POINT_SIZE_ARRAY_OES);
glDisable(GL_POINT_SPRITE_OES);

これらは、OpenGL ES 2.0 コンテキストを使用すると BAD_ACCESS を生成します。PointSprite ごとに 2 つの TRIANGLES を使用する必要がありますか? しかし、それはおそらくあまり効率的ではありません (余分な頂点のオーバーヘッド)。

編集:だから、提案された解決策に関する私の新しい問題: https://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528

バッチ呼び出しでさまざまなサイズを渡す可能性があります。Uniform の代わりに Attribute を使用することを考えましたが、GL_POINTS を描画していなくても、常に PointSize をシェーダーに渡す必要があります。では、おそらく 2 番目のシェーダー (GL_POINTS のみのシェーダー) でしょうか?! 描画ルーチンのフレームごとにシェーダーを切り替えるためのオーバーヘッドを認識していません (パーティクル システムが使用されている場合は、pointSize なしで通常の GL_TRIANGLES も当然レンダリングしたいため)...これに関するアイデアはありますか?

4

1 に答える 1

0

したがって、ここですでにコメントしたように、ここで行うことが必要です

どのアプローチを採用するかについては、アプリケーションのさまざまな種類のドローアブルにさまざまなシェーダーを使用するか、シェーダーで別のブール値のユニフォームを使用しgl_PointSizeて、シェーダー コードによる変更を有効または無効にするように指示できます。それは通常あなた次第です。覚えておく必要があるのは、シェーダー プログラムの変更は、最も時間のかかる操作の 1 つであるため、同じタイプのオブジェクトをバッチで描画する方がよいということです。シェーダー コードで if ステートメントを使用すると、パフォーマンスが大幅に向上するかどうかはわかりません。

于 2011-10-23T15:44:10.723 に答える