openGL API glDebugMessageControl详解
Name
glDebugMessageControl — control the reporting of debug messages in a debug context
C Specification
| GLenum source, |
| GLenum type, |
| GLenum severity, |
| GLsizei count, |
| const GLuint *ids, |
| GLboolean enabled |
Parameters
source
The source of debug messages to enable or disable.
type
The type of debug messages to enable or disable.
severity
The severity of debug messages to enable or disable.
count
The length of the array ids
.
ids
The address of an array of unsigned integers contianing the ids of the messages to enable or disable.
enabled
A Boolean flag determining whether the selected messages should be enabled or disabled.
Description
glDebugMessageControl
controls the reporting of debug messages generated by a debug context. The parameters source
, type
and severity
source
may be GL_DEBUG_SOURCE_API
, GL_DEBUG_SOURCE_WINDOW_SYSTEM_
, GL_DEBUG_SOURCE_SHADER_COMPILER
, GL_DEBUG_SOURCE_THIRD_PARTY
, GL_DEBUG_SOURCE_APPLICATION
, GL_DEBUG_SOURCE_OTHER
to select messages generated by usage of the GL API, the window system, the shader compiler, third party tools or libraries, explicitly by the application or by some other source, respectively. It may also take the value GL_DONT_CARE
. If source
is not GL_DONT_CARE
then only messages whose source matches source
type
may be one of GL_DEBUG_TYPE_ERROR
, GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR
, GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR
, GL_DEBUG_TYPE_PORTABILITY
, GL_DEBUG_TYPE_PERFORMANCE
, GL_DEBUG_TYPE_MARKER
, GL_DEBUG_TYPE_PUSH_GROUP
, GL_DEBUG_TYPE_POP_GROUP
, or GL_DEBUG_TYPE_OTHER
to indicate the type of messages describing GL errors, attempted use of deprecated features, triggering of undefined behavior, portability issues, performance notifications, markers, group push and pop events, and other types of messages, respectively. It may also take the value GL_DONT_CARE
. If type
is not GL_DONT_CARE
then only messages whose type matches type
severity
may be one of GL_DEBUG_SEVERITY_LOW
, GL_DEBUG_SEVERITY_MEDIUM
, or GL_DEBUG_SEVERITY_HIGH
to select messages of low, medium or high severity messages or to GL_DEBUG_SEVERITY_NOTIFICATION
for notifications. It may also take the value GL_DONT_CARE
. If severity
is not GL_DONT_CARE
then only messages whose severity matches severity
ids
contains a list of count
message identifiers to select specific messages from the pool of available messages. If count
is zero then the value of ids
is ignored. Otherwise, only messages appearing in this list are selected. In this case, source
and type
may not be GL_DONT_CARE
and severity
must be GL_DONT_CARE
.
If enabled
is GL_TRUE
then messages that match the filter formed by source
, type
, severity
and ids
Notes
Although debug messages may be enabled in a non-debug context, the quantity and detail of such messages may be substantially inferior to those in a debug context. In particular, a valid implementation of the debug message queue in a non-debug context may produce no messages at all.
GL_DEBUG_TYPE_MARKER
, GL_DEBUG_TYPE_PUSH_GROUP
, GL_DEBUG_TYPE_POP_GROUP
, and GL_DEBUG_SEVERITY_NOTIFICATION
are available only if the GL version is 4.3 or higher.
Errors
GL_INVALID_VALUE
is generated if count
GL_INVALID_ENUM
is generated if any of source
, type
or severity
GL_INVALID_OPERATION
is generated if count
is non-zero and either source
or type
is GL_DONT_CARE
or if severity
is not GL_DONT_CARE
.
Version Support
| OpenGL Version | |||||||||||
Function / Feature Name | 2.0 | 2.1 | 3.0 | 3.1 | 3.2 | 3.3 | 4.0 | 4.1 | 4.2 | 4.3 | 4.4 | 4.5 |
| - | - | - | - | - | - | - | - | - | ✔ | ✔ | ✔ |
See Also
glDebugMessageInsert, glDebugMessageCallback, glGetDebugMessageLog.
Copyright
Copyright © 2013-2014 Khronos Group. This material may be distributed subject to the terms and conditions set forth in the Open Publication License, v 1.0, 8 June 1999. http://opencontent.org/openpub/.
前言:调试输出是OpenGL4.3版本中增加的一种用于调试的扩展工具。它不仅比glGetError接口提供更多的错误信息,而且还允许通过debugger去定位错误源。
创建调试环境:环境的创建是与平台相关的任务,一般由各种封装库提供接口进行创建。常见的创建方式如下:
1.GLFW创建方式:需要在创建OpenGL环境之前进行调试环境的创建。创建代码如下所示:
2.WGL创建方式:需要在创建OpenGL环境之后进行调试环境的创建。创建代码如下:
3.GLX创建方式:无需先创建OpenGL环境就可以进行调试环境创建。创建代码如下:
检查调试环境:要检查是否成功地初始化了调试环境,我们可以对OpenGL进行查询。检查代码如下所示:
开关调试消息:传递调试消息默认是启动的,当然我们也可以禁止。通常使用GL_DEBUG_OUTPUT或者GL_DEBUG_OUTPUT_SYNCHRONOUS来调用glEnable接口进行启用,或者调用glDisable接口来进行禁用。
传递调试消息:调试环境存在两种方式将获取的调试消息传递给开发者。第一种方式就是设置回调函数。第二种方式就是通过远程渲染方式利用调试环境获取调试消息日志。
常用接口如下:
1.void glDebugMessageCallback(DEBUGPROC callback, void* userParam)
:设置一个新的调试消息回调函数callback给调试环境。当调试消息生成的时候就会触发这个回调函数,并将调试消息以及用户自定义参数userParam传递给回调函数callback。
其中DEBUGPROC声明如下所示:
void DEBUGPROC(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, void *userParam)
:
.source表示消息来源。通常是GL_DEBUG_SOURCE_API(OpenGL API),GL_DEBUG_SOURCE_WINDOW_SYSTEM(窗口系统),GL_DEBUG_SOURCE_SHADER_COMPILER(着色器编译器),GL_DEBUG_SOURCE_THIRD_PARTY(第三方库),GL_DEBUG_SOURCE_APPLICATION(应用程序),GL_DEBUG_SOURCE_OTHER(其他)当中的一种。
.type表示消息类型。通常是GL_DEBUG_TYPE_ERROR(错误生成),GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR(过时功能),GL_DEBUG_TYPE_UNSINGNED_BEHAVIOR(未定义功能),GL_DEBUG_TYPE_PERFORMANCE(性能不优),GL_DEBUG_TYPE_PORTABILITY(不能移植),GL_DEBUG_TYPE_MARKER(注解),GL_DEBUG_TYPE_PUSH_GROUP(调用glPushDebugGroup),GL_DEBUG_TYPE_POP_GROUP(调用glPopDebugGroup),GL_DEBUG_TYPE_OTHER(其他)当中的一种。
.id表示消息标志。
.severity表示消息等级。通常是GL_DEBUG_SEVERITY_HIGH(致命消息。如:OpneGL错误,着色器编译失败等),GL_DEBUG_SEVERITY_MEDIUM(不致命消息。如:移植性能警告),GL_DEBUG_SEVERITY_LOW(没危害消息。如:冗余的状态切换),GL_DEBUG_SEVERITY_NOTIFICATION(普通通知消息)当中的一种。
.message表示调试消息。
.userParam表示用户自定义参数。与设置回调时传入的自定义参数相关联。
有了这一大堆的数据,我们可以创建一个非常有用的错误打印工具。代码如下所示:
过滤调试消息:可以过滤出需要的调试消息。使用接口如下所示:
void glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled)
:
.source表示消息来源。
.type表示消息类型。
.severity表示消息等级。
.count表示消息标志符的数目。
.ids表示消息标志符的数组。
.enabled表示是否启用,为GL_FALSE时表示丢弃消息。
自定义调试消息:可以自定义调试消息传送给调试环境。使用接口如下:
void glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf)
:
.source表示消息来源。
.type表示消息类型。
.id表示消息标志。
.severity表示消息等级。
.length表示自定义消息的长度。
.buf表示自定义的消息内容。
调试组:就是用来存储调试状态的堆栈,且堆栈大小通常是64组,可以通过GL_MAX_DEBUG_GROUP_STACK_DEPTH参数来调用glGetIntegerv接口获取。常用接口如下:
1.void glPushDebugGroup(GLenum source, GLuint id, Glint length, const GLchar* message)
:将当前的调试状态压入OpenGL管理的堆栈。
.source限制为GL_DEBUG_SOURCE_APPLICATION或者GL_DEBUG_SOURCE_THIRD_PARTY。
.type限制为GL_DEBUG_TYPE_PUSH_GROUP。
.severity限制为GL_DEBUG_SEVERITY_NOTIFICATION。
.id表示消息标志。
.length表示消息长度。
.message表示消息内容。
2.void glPopDebugGroup(void)
:将当前堆栈上的调试状态弹出。
命名对象:就是对OpenGL管理的对象标志关联一个名称,从而可以使用名称来访问该对象。常用接口如下:
1.void glObjectLabel(GLenum identifier, GLuint name, Glsizei length, const GLchar* label)
:为OpenGL拥有的对象生成标签。
.identifier表示分配对象的名称空间。通常是GL_BUFFER,GL_SHADER,GL_PROGRAM等来源中的一种。
.name表示生成对象的唯一标识。
.length表示标签长度。
.label表示标签内容。
2.void glGetObjectLabel(GLenum identifier, GLuint name, Glsizei bufsize, Glsizei * length, GLchar* label)
:获取glObjectLabel接口分配的对象标签。
.identifier表示分配对象的名称空间。
.name表示生成对象的唯一标识。
.length表示标签长度。
.label表示标签内容。
3.void glObjectPtrLabel(void* ptr, Glsizei length, const GLchar* label)
:为OpenGL拥有的指针对象生成标签。
.ptr表示指针对象。
.length表示标签长度。
.label表示标签内容。
4.void glGetObjectPtrLabel(void* ptr, Glsizei bufsize, Glsizei* length, const GLchar* label)
:获取glObjectPtrLabel接口分配的对象标签。
.ptr表示指针对象。
.length表示标签长度。
.label表示标签内容。
回溯调试错误源:可以在调试消息回调函数中打断点,当调试消息生成并调用该回调时就会触发对应断点。可以从断点堆栈中找到OpenGL程序的执行过程,从而找出错误源。如图所示:
在线例子:以下提供一个包含调试输出的大部分接口的在线例子。
参考
https://www.khronos.org/registry/OpenGL-Refpages/gl4/