OpenGLで小さな粒子を描画する最速の方法?


8

簡単な質問:openglで4x4 / 8x8パーティクルの大きな配列をレンダリングする最も速い方法はどれですか。現在、私はそれぞれに2つの三角形を費やしていますが、遅いと思うので、正しく実行しているかどうかを知りたいです。


1
これはパフォーマンスに関する質問なので、ターゲットプラットフォームでパフォーマンスを測定する必要があることを思い出してください。(a)心配する価値があるほど十分に高いことを確認し、(b)提案されたソリューションのスピードアップをテストします。
ネイサンリード

回答:


6

OpenGLでポイントを描くことができます。

(GL_TRIANGLE_STRIPまたは使用しているものの代わりにGL_POINTS指定してglDrawArrays()またはglDrawElements()を呼び出したい。

これは、現在のポイントサイズに基づいて画面にポイントを描画します。これは、glPointSize()で設定できます。これらのポイントにエイリアスを設定することもできますが、私の経験では、すべてのドライバ/ハードウェアがエイリアスポイントをサポートしているわけではありません。

これらのポイントをテクスチャリングすることはできません。単色です。


ヒントをありがとう。テクスチャをそれらにもマッピングできるように、シェーダーを使用してGL_POINTメソッドを実行できるかどうかを知っていますか?
user1010005 2012

1
シェーダーで使用できますが、ポイント(中心)の頂点は1つしかないため、tex座標を思い付くのが難しい場合があります。stackoverflow.com/questions/5839095/…これについて少し話しているように見えます...
notlesh

GL_POINTSでもポイントスプライトを設定できます。
Mick

1
@ user1010005 GL_POINTSでテクスチャマップを作成するには、GL_POINT_SPRITE_ARBを調べます。また、ポイントがどれだけ近くても遠くても、ポイントは常に画面上の同じピクセル数を占めることになります。
kevintodisco 2012

@ktodiscoでは、ポイントサイズを属性として渡すことができます。私はこれを行うことによってまともな星の効果を達成しました。vertシェーダーのサイズを変更するには、変数gl_PointSize
notlesh

3

コアOpenGL 3.2以降では、ジオメトリシェーダーを使用できます。概要を説明するために、OpenGLにパーティクルの位置を表すポイントのみを描画するように指示します。これらのポイントは通常、頂点シェーダーを通過しますが、ジオメトリシェーダーに到達すると、長方形を作成します(外に2つのトライの)パイプラインの次のステージに頂点を放出することによって。頂点に加えて、プログラムで法線とテクスチャ座標を生成できます。

これはすべてハードウェアで行われるので、ポイントスプライトパーティクルをレンダリングする現在の最速の方法であると確信しています。


1
これはおそらくGL_POINTSよりも優れたソリューションですが、古いOpenGL実装(およびOpenGL ES)では機能しません。
notlesh

素晴らしいようですが、ゲームをAndroidプラットフォームに移植する予定です:(
user1010005

2
@ user1010005ちょっとしたヒントですが、質問するときは、どの制約を使用すればよいかがわかるので
注意

私はopenglの初心者です。申し訳ありませんD:
user1010005 2012

私が考えLOVEのOpenGL ESで利用可能となるジオメトリシェーダを参照してください。)=
notlesh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.