「がんばれない」けど「がんばりたい」

ITエンジニアの仕事のこと。AI、機械学習、ディープラーニング。地頭力。車のこと。

Point Spriteを使ってみる

ofTextureの基本的な使い方を復習したので、 ポイントスプライトでテクスチャを張ってみようと思います。

■概要

 ポイントスプライトはGL_POINTS で描かれる「点」にテクスチャをマッピングする機能。 OpenGLのGL_POINTSで描画する場合、 デフォルトではプリミティブな四角系のみなので、 これにテクスチャを張る事で、パーティクルの表現等に使われています。

■コーディングの流れ

  1. テクスチャ画像を用意しておく。
    外部ファイルとして用意しても良いですし、 プログラムでメモリに直接書き込むようにする方法でも。普通は画像ファイルとして用意する方が多いですね。

  2. テクスチャ画像のロード
    ofTextureオブジェクトに対して1)の画像をロード。

  3. ポイントスプライトの有効化とテクスチャのバインド

■ポイント

  1. テクスチャ画像がalpha値を持つものであれば、 アルファブレンディングも有効化してないといけませんね。oFではデフォルトでアルファブレンディングは有効になっているようですが。

  2. テクスチャ画像のロード時にofDisableArbTex();を行ってからofTextureオブジェクトに画像ファイルを指定して転送するみたいです。 ofDisableArbTex();については、良く知らないのですが、OpenGLのテクスチャ画像の縦横ピクセル数が2のべき乗になっていないといけないのですが、それを無効化?するようですね。。もう少し調べたら別の機会に。。また、ロードメソッドはofLoadImageで行います。

■サンプルコード

ポイントとなる箇所のみですが、 サンプルを掲載します。

//--------------------------------------------------------------
void testApp::setup(){

    /*----------------------------
     Texture init.
     ---------------------------*/
    ofDisableArbTex();
    ofLoadImage(mTexture, "dot.png");

}

//--------------------------------------------------------------
void testApp::draw(){

    //アルファブレンディング有効
    ofEnableAlphaBlending();

    //必要ならば
    ofEnableBlendMode(OF_BLENDMODE_ADD);

    //ポイントスプライト有効
    ofEnablePointSprites();
    cam.begin();
    
    //テクスチャバインド
    mTexture.bind();

    //GL_POINTSで描画
    glBegin(GL_POINTS);
    for (int i = 0; i < NUM_PARTICLE; i++)
    {
        Particle &p = particles[i];
        if (p.life > 0)
        {
            p.draw();
        }
    }
    glEnd();

    //テクスチャアンバインド
    mTexture.unbind();
    
    cam.end();

    //ポイントスプライト無効
    ofDisablePointSprites();

    //全てのブレンドモードを無効
    ofDisableBlendMode();

}