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_ENUMやGL_INVALID_OPERATIONが発生していることを確認し、原因を突き止めた。
int (GLint)でないければならなかったのだ。
試しにintとunsigned intの足し算や引き算を行ってautoで受けてその型を調べたらunsigned intになっていた。色んな意味でつらぽよい事象であった。。。