OpenGLのエラーハンドリング

opengl-error.png

コード

GLenum errcode=glGetError();
        if(errcode!=GL_NO_ERROR){
            const GLubyte *errstring=gluErrorString(errcode);
        printf("%s\n",errstring);
        }
static void GetGLError(const char* op) {
        for (GLint error = glGetError(); error; error= glGetError()) {
            printf("after %s() glErrorCode:%x=%s\n", op, error,gluErrorString(error));
            assert(!"!glError\n");
        }
    }

glGetStringと間違えないこと!

エラー番号

エラー定義名 16進数 10進数 内容
GL_NO_ERROR 0
GL_INVALID_ENUM 0x0500 1280  無効な列挙 GLenum型の引数が範囲を超えている
GL_INVALID_VALUE 0x0501 1281 無効な値 引数が範囲を超えている
GL_INVALID_OPERATION 0x0502 1282  無効な演算。1
GL_STACK_OVERFLOW 0x0503 1283 スタックオーバーフロー
GL_STACK_UNDERFLOW 0x0504 1284  スタックアンダーフロー
GL_OUT_OF_MEMORY 0x0505 1285  実行するのにメモリが足りない。
GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 完全じゃないフレームバッファを書いたり読んだりしようとしている

504:スタックアンダーフロー

スタックが枯渇している状態にも関わらず、スタックからデータを呼び出してしまうこと。
スタックをpopしすぎたということ。
glPopMatrix()
を使った時に起こるようだ。

スタックオーバーフロー

スタックをpushしすぎたせい。

スタックオーバーフロー対策

現在のスタックのサイズを調べて、増え続けたり、減り続けたりしていないかチェックしよう。

int stacksize;
glGetIntergerv(GL_ATTRIB_STACK_DEPTH,&stacksize);//現在の属性スタックのサイズ

他にも
GL_NAME_STACK_DEPTH
というのもある


debug opengl-debug

サポートサイト Wikidot.com debugopengl-debug