LoginSignup
12
6

More than 5 years have passed since last update.

[openFrameworks] ofDisableArbTex() の挙動

Last updated at Posted at 2018-08-04

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()を必ず呼ぶ)をしたほうが少しは面倒くさくないのではと思います。

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6