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

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

openFrameworks.cc Tutorial|openglを読む

openFrameworks.cc/tutrials/grahics/openglを読んで、ポイントになる箇所をメモ

■ofMesh

・位置や色情報をセットした後に、インデックスをセットする。そうしないとテクスチャや影などの効果を与える時に表と裏が分からなくなり思った様にいかない。

■VBO

・頂点情報をGPUメモリにストアする方法 ・VertexArraysとDisplayList両方の機能と似ている。VretexArraysだと、頂点座標配列をCPU側で作成してGPUにデータを転送しdrawさせる。DisplayListの方は、ちょっとマシで、一度データをGPUメモリ内に展開した後は、CPU側からデータを毎フレーム毎に転送する必要がない。ただしDisplayListの場合、データを変更する事は出来ないので、もしデータを変更する場合は、CPU側からGPUに存在するデータをロードし、モディファイし、GPUに転送する必要がある。

VBOはDisplayListに似ているのだが、GPUにあるデータをモディファイする時に、全てのデータを一気にdownloadする必要がない。 手順は、何かを作成する=>GPUにデータをストアする=>最新のデータを準備(データの変更)が完了したら、GPUにその他全てのデータと一緒にpushする。

一般的には何度も同じVertexデータを使う予定があったり、長い時間そのデータをキープしたい場合には、有効って事です。

なのでofMeshを使用するのであればofVboMeshクラスを使った方が良いようだ。さらにofVboMeshインスタンスを複数使うと描画をより高速に出来る。ただGPUが十分な能力がないとダメだけど。=>ofVboMeshのdrawInstanced()を使う。サンプルコードはvboMeshDrawInstancedExample

■Texture

  • textureはGPU内のデータ
  • CPUで保持しているデータではない。
  • GPU内のデータは直接変更できない。
  • CPUでピクセルデータを取り扱う場合はofPixelsクラスを使う
  • oFでビットマップデータを取り扱うには、この2つのクラスが基本としてある。(ofPixels, ofTexture)
  • ofImageは、この2つをプロパティとして持っている事を理解する必要がある

  • textureには3つの定義がある。size, テクスチャタイプ、イメージフォーマット。

  • テクスチャはビットマップデータというより、「どのようにビットマップデータがスクリーン上に描画されるか?」を示すもの
  • ofImageオブジェクトはloadImageメソッドを使ってファイルからデータを取得出来る。またgrabScreenメソッドを使うとスクリーンからデータをロード出来る。どちらのメソッドで取得したデータもofImageの内部にあるofTextureオブジェクトに転送される。drawメソッドで描画した後に、データを編集する場合はgetPixelsメソッドを使用して取得し、データを変更した後、setPixelsメソッドを行い、update()=>draw()という順番になる。

  • GPUにロードされたtextureには識別IDが付与される。

  • oFではARB texture coordinatesが使用されている。テクスチャサイズがw,hだとすると左上=0,0、右下=w,hになる座業系。もしNormarizedCoodinates(0,0〜1.0)を使用したければofEnableNormalizedTexCoords()を使用する。

  • of3dPremitive::mapTexCoords|bindされるテクスチャデータの範囲を指定する。

  • 課題|ofTexture::setTextureWrapの使い方を覚える
  • 課題|alphaを持ったテクスチャや、複数テクスチャの重なりについては別途