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
になっていた。色んな意味でつらぽよい事象であった。。。