ofEnableArbTex()
/ ofDisableArbTex()
の挙動
ofEnableArbTex()
/ ofDisableArbTex()
はテクスチャを生成する際のフォーマットを決めます。これらの関数はShader内でのテクスチャ参照方法に影響があるので注意が必要で、それぞれの挙動を以下にまとめます。
-
ofEnableArbTex()
を呼んだ後のテクスチャはGL_TEXTURE_RECTANGLE_ARB
で生成される(デフォルト) -
ofDisableArbTex()
を呼んだ後のテクスチャはGL_TEXTURE_2D
で生成される
GL_TEXTURE_RECTANGLE_ARB |
GL_TEXTURE_2D |
|
---|---|---|
特徴 | Non-power-of-two sized (NPOTS) | |
glsl内のsampler型 | sampler2DRect | sampler2D |
テクスチャ参照座標 | [ 0 ... w ] x [ 0 ... h ] (非正規化座標、矩形座標) | [ 0 ... 1 ] x [ 0 ... 1 ] (正規化座標) |
関連する豆知識
- OpenGLにはたくさんのテクスチャフォーマットがあるが、openFrameworksでは基本的に上記2つのフォーマットのみ想定している
OpenGLの用意するテクスチャのフォーマットのenum値については、ドキュメントに書いてあります。Cube Map用のフォーマットや3次元テクスチャなど、様々な用途を想定して仕様策定されているのがわかりますが、oFの場合は上述の2つのみを利用する想定でデザインされています。(利用頻度的に問題ない、かつ、必要であればGLの関数をそのまま用いれば良い)
-
ofMesh::plane()
やofRectangle()
は正規化済みのテクスチャ座標が付与される
よって、デフォルトのGL_TEXTURE_RECTANGLE_ARB
の状態で、ofTexture::bind()
などでテクスチャをメッシュなどにバインドしようとしても参照方式が正規化座標ではないのでうまく動作しません。つまりデフォルトの状態では、テクスチャバインドは動作せず、 テクスチャ座標を矩形座標にあわせてつけなおすか、おとなしくofDisableArbTex()
を呼んでから生成したテクスチャをバインドする必要があります。これは仕様でありフォーラムでも過去に議論されています。
デフォルトでofRectangle()
などにテクスチャバインドが動かないのは不便だから、ofEnableArbTex()
のときは、Rendererにわたすテクスチャ座標をゴニョってよしなにやろうよとissueを投げたところ、それはダメと瞬殺でCloseされました…。一瞬のできごとでした…。
- Non-power-of-two sized (NPOTS)
GL_TEXTURE_RECTANGLE_ARB
はNon-power-of-two sized (NPOTS)であり、その意味するところは、ピクセルサイズが2のべき乗でなくても再サンプリングしないテクスチャを指します。ドキュメントはこちら。再サンプリングが無いためARBテクスチャの方が配置リソースの効率化が期待できますが、ラップ方式やミップマップの使用などに一部制約があります。
ちなみに接尾語のARBとは、Khronos Groupとは独立して組織された(現在は合流)"Architecture Review Board"の略で、この団体から提案された仕様であることの名残とのこと。Arbitararyの略かなとか盛大に勘違いしていました。指摘してくださった2bitさんありがとうございます。。
(ただ、そうなるとArbTexとついた関数名は少し不適切なのではとも思う)
- どちらを利用すべきか?
個人的には、WebGL含むOpenGL ESでは、GL_TEXTURE_RECTANGLE_ARB
がないことから、Shaderの移植性なども考慮し、GL_TEXTURE_2D
に倒して(つまり、ofDisableArbTex()
を必ず呼ぶ)をしたほうが少しは面倒くさくないのではと思います。