0

我正在尝试使用 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 产生编译器/链接器错误,但我没有从回调函数接收调试信息。

4

2 回答 2

3

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

glDebugMessageCallbackARB(new ARBDebugOutputCallback());

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

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

于 2013-11-03T10:45:07.283 回答
1

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

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

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

简而言之,这为所有来源、严重性和类型启用了消息。这将使您的调试输出尽可能详细,因为您的实现可能会给您。

您可能会考虑的另一件事是:

glEnable (GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);

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


我在不久前写的答案 中有一个所有这些事情的例子,你可能会发现一些代码(即使它是用于 C 的)很有用。

于 2013-11-03T02:31:35.417 回答