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

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

ofTextureの復習

この記事を書き始めた時は、 PointSpriteの事を書こうと思ったのですが、 それをするにあたりテクスチャは必須なので、 まずはofTextureの復習を。

ofTextureのドキュメントを見ると、

ofTexture is used to create textures that live on your graphics card from bitmap data that can then be used to fill other drawn objects, like a bitmap fill on a rectangle. When you draw an ofImage, you're actually just drawing a rectangle of points and then using an ofTexture to fill the space between those points. At it's core, ofTexture is a wrapper for OpenGL textures. It allows use of non-power of 2 textures in opengl, and to upload and draw graphical data.

どうもofTextureはテクスチャを作成するために使うと。。 テクスチャ(データ)はビットマップデータ(外部ファイルなどなど)から作られて、そしてグラフィックカードでストアされています。とのこと。

つまりopenGL(というわけでもないですが)では、 テクスチャはGPU側のメモリ内で保持されるデータの事。

もう少しドキュメントを読むと。 ofImage.draw()では、まず1つポイントを描画していて、 それらの点間をofTextureを使用して塗りつぶしている。と。 しかもopenGLで一般的にテクスチャ画像として使えるのは、 縦横ピクセルが2の倍数になっていないといけないけども、 そーじゃない画像も使用できると。。 ちょい、よくわからんが。。

まぁサンプルコードを追って行けば分かるかもしれないと期待して、 oFのテクスチャサンプルのソースコードを読んでみる。

ofTextureの基本的な使い方を見てみると。


  1. ofTexture型のオブジェクトを宣言
  2. メモリのallocate
  3. ビットマップデータの用意
    ※サンプルではunsigned char型のポインタを用意し、メモリに対してランダムにデータを書き込んでいます。
  4. ofTextureオブジェクトのloadメソッドで3)のデータを読み込む
  5. ofTexture.draw()で描画

だいたいこんな感じ。 allocateとload時はRGBなのかRGBAなのか単色なのかを指定する必要があるようです。

ofTextureは上にも書いた様にGPU側の画像配列ですが、 oFにはofPixelsクラスというofTextureと同じように画像データを扱うクラスがあります。 大きな違いはofPixelsはCPUメモリ空間を使用するというところです。

openGLで画像を表示する」=「GPUにあるデータを表示する」という事なので、 もしofPixelsでデータを作成したらGPUにデータをofTextureとして転送する必要がある。 この転送コストがかかってしまうので、 例えば毎フレーム毎にofPixelsでデータを作ってGPUに転送するような事を 行ってしまうとフレームレートが下がる事になるようですね。

GPUにストアされた画像データがイラナくなったら、 クリアするようにした方が良いのかな。 ofTexture.clear();

あと、textureだけじゃないけど、 drawする前に、このtextureを採用する事を宣言する必要がある。 oFの場合は.bind();を使って宣言し、unbind();で宣言を破棄する。