OpenGL2.0の仕様に入ったポイントスプライト。ベースとなったのはGL_ARB_point_sprite拡張で、これに少し追加がされてるとのこと。

で、GL_ARB_point_spriteについて書こうかと。ただ、Extension RegistryCodeSamplerのサンプルデモ見て書いただけなので細かい所で間違ってるかもしれず。後で自分でも試して見ないと。

以下、書いてみたけど、なんかまとまりが悪くて読みにくい。比較としてDirectXのヘルプ読んでみたけど機能はほぼ同じで詳しいので、そっちとExtension Registry見比べたほうがいいかも。


パーティクルエフェクトなんかに使われるわけだけど、一般に個々のパーティクルが持っているのは座標(x,y,z)の情報のみ。で、これをどうやって描写するか。

テクスチャを貼る場合GL_POINTSは×。仮にテクスチャ座標指定してもその座標の色1色になるので。
ポイントスプライトの機能がない場合、QUADSやTRIANGLE_STRIPで代用できるけど、座標変換のコストが余分にかかる。
んで、GL_ARB_point_spriteはこの問題を解決するために、GL_POINTS使ってパーティクル描いても、ラスタライズ時にうまいことテクスチャ座標を設定してくれる拡張。


glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE );
glEnable( GL_POINT_SPRITE_ARB );
glBegin( GL_POINTS );
glVertex3f(...);
glEnd();
glDisable( GL_POINT_SPRITE_ARB );
テクスチャ側の設定
glTexEnvf(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
これを指定することによってラスタライズの際、各ピクセルに適切なテクスチャ座標が設定される。
次にポイントスプライトの描写を始める前に
glEnable(GL_POINT_SPRITE_ARB);
が必要。描写に使うのはGL_POINTS。終わったら
glDisable(GL_POINT_SPRITE_ARB)を忘れずに。


他に、各パーティクルのサイズはglPointSize(int size)で設定できる。けど、これはスクリーン座標上のサイズなので注意。
視点からの距離に応じてパーティクルのサイズを変えるにはGL_ARB_point_parameters拡張を。これはOpenGL1.4から標準として入ってる。