无法从LWJGL获得ARB调试输出

时间:2013-11-03 01:07:02

标签: debugging opengl output lwjgl

我正在尝试使用ARB_debug_output扩展但我无法从中获取任何输出(故意不正确的着色器不会导致调试输出)。我猜我使用扩展程序时犯了一个错误。

我已使用;

设置启用调试的上下文
        ContextAttribs contextAtrributes = new ContextAttribs(3, 2) // Core OpenGL version 3.2
        .withForwardCompatible(true)
        .withProfileCore(true)
        .withDebug(true);

我使用;

检查调试输出扩展名
            ContextCapabilities caps = GLContext.getCapabilities();
        if ( caps.OpenGL32 )
            System.out.println("OpenGL version 3.2 supported");
        if ( caps.GL_ARB_debug_output )
            System.out.println("ARB_debug_output extension supported");

提供以下输出;

OpenGL version 3.2 supported
ARB_debug_output extension supported

我设置了一个回调函数来使用;

来打印调试输出
new ARBDebugOutputCallback();

在此之后,我使用错误/错误的着色器等运行我的程序,使用glGetShaderInfoLog和glGetError产生编译器/链接器错误,但我没有从回调函数接收调试信息。

2 个答案:

答案 0 :(得分:3)

您需要将 ARBDebugOutputCallback 实例传递给 glDebugMessageCallbackARB 方法,如下所示:

glDebugMessageCallbackARB(new ARBDebugOutputCallback());

这相当于在C API中传递函数指针。

请注意,没有 userParam 参数;当存在多个OpenGL上下文时,LWJGL在内部使用它来正确实现ARB_debug_output。无论如何,在Java中都没有必要使用 ARBDebugOutputCallback(Handler)构造函数传递每个实例的数据。

答案 1 :(得分:1)

我对LWJGL不熟悉,但我 非常 熟悉此扩展...设置回调不足以让它产生任何输出。您还需要指定您感兴趣的事件类型,严重性和来源。

从OpenGL的C绑定中,需要这样的调用才能生成输出消息:

glDebugMessageControlARB (GL_DONT_CARE,GL_DONT_CARE,GL_DONT_CARE,0,NULL,GL_TRUE);

简而言之,这可以为所有来源,严重性和类型启用消息。这将使您的调试输出像您的实现可能提供的那样详细。

您可能会考虑另一件事:

glEnable (GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);

这可能会增加开销,但会立即输出调试信息,而不是缓冲它并定期刷新。这对于诊断应用程序终止事件非常有用。

<小时/> 我在answer I wrote a while back中有一个关于所有这些事情的例子,您可能会发现一些代码(即使它适用于C)很有用。

相关问题