More than 1 year has passed since last update.

Multiple Textureを扱うためにTexture Unitというものがある。(初期値は0で、同時に1枚のテクスチャしか扱わない場合は特に気にしなくてもいい。)

例えば、
glActiveTexture(GL_TEXTURE0);
glActiveTexture(GL_TEXTURE1);
glActiveTexture(GL_TEXTURE2);

のように指定する。また、
glActiveTexture(GL_TEXTURE0 + 0);
glActiveTexture(GL_TEXTURE0 + 1);
glActiveTexture(GL_TEXTURE0 + 2);

というようにも指定できる。

Texture関連のOpenGLラッパークラスを作成していたところここでハマった。

クラスメンバーに、
GLuint mTextureUnit;
というものを持っておいて、
glActiveTexture(GL_TEXTURE0 + mTextureUnit);
というように利用しようという算段である。

どうせ0以上の数だしunsigned int (GLuint)でいいだろうと思ったのが運の尽き。
0以外のTexture Unitにバインドしたテクスチャが利用できないという事態に。
そうとう長い間シェーダーが悪いのかと考えてひたすらシェーダーを書き換えていたが、
glGetErrorやOpenGL4.3から標準規格となったDebugMessageによってGL_INVALID_ENUMGL_INVALID_OPERATIONが発生していることを確認し、原因を突き止めた。

int (GLint)でないければならなかったのだ。


試しにintunsigned intの足し算や引き算を行ってautoで受けてその型を調べたらunsigned intになっていた。色んな意味でつらぽよい事象であった。。。