OpenGLのデバッグ

opengl-debug.png

どのシェーダが悪さをしてるか調べる

現在バインドされているシェーダプログラム番号を取得

int[] params=new int[1];
GLES20.glGetIntegerv(GLES20.GL_CURRENT_PROGRAM, params, 0);

OpenGL4.3以降の新機能 詳しいデバッグメッセージを得る

static void __stdcall  debugCallbackFunc(GLenum source, GLenum type, GLuint eid, GLenum severity, GLsizei length, const GLchar* message, const void* user_param)
{
    cout << "OpenGL error" << message << endl;
    if (severity == GL_DEBUG_SEVERITY_HIGH) {
        assert(!"!GL_DEBUG_SEVERITY_HIGH OpenGLError\n");
    }
}
int main(int argc, char **argv)
{
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, true);
GLFWwindow* window = glfwCreateWindow(300, 300, "Hello OpenGL4", nullptr, nullptr);
glfwMakeContextCurrent(window);
glewInit();
glDebugMessageCallback(debugCallbackFunc,NULL);
glEnable(GL_DEBUG_OUTPUT);//Debug Context はデフォルトで glEnable( GL_DEBUG_OUTPUT ) になるので無くても構いません

たとえばこんなメッセージ
OpenGL errorBuffer detailed info: Buffer object 1 (bound to GL_ARRAY_BUFFER_ARB,
 usage hint is GL_STATIC_DRAW) will use VIDEO memory as the source for buffer ob
ject operations.

severity

GL_DEBUG_SEVERITY_LOW 大問題ではないけおd、ちょっとパフォーマンスの問題を引き起こす
GL_DEBUG_SEVERITY_NOTIFICATION 悪い結果は起こさない。

メッセージと対処方法

Program/shader state performance warning: Fragment Shader is going to be recompiled because the shader key based on GL state mismatches.

描画が終わった後、glUseProgram(0)で締めるようにしたらでなくなった。


opengl-error

サポートサイト Wikidot.com opengl-error