我有一个opengl玩具代码,我用它来学习ogl和3d图形。我使用glDebugMessageCallback
和glDebugMessageControl
来检查OGL错误,在windows上我没有任何消息。我现在在linux上测试我的代码,我得到了很多这样的消息:
Debug message (1): Shader Stats: SGPRS: 16 VGPRS: 12 Code Size: 88 LDS: 0 Scratch: 0 Max Waves: 8 Spilled SGPRs: 0 Spilled VGPRs: 0 PrivMem VGPRs: 0 DivergentLoop: 0, InlineUniforms: 0, ParamExports: 2, (VS, W64)
Source: Shader Compiler
Type: Other
Severity: notification
这里有一些关于我的环境的更多信息
[OpenGL] OpenGL version loaded: 4.6
[OpenGL] Vendor: AMD
[OpenGL] Renderer: AMD Radeon RX 570 Series (polaris10, LLVM 13.0.1, DRM 3.44, 5.17.3-302.fc36.x86_64)
[OpenGL] Version: 4.6 (Compatibility Profile) Mesa 22.0.1
[OpenGL] Version GLSL: 4.60
我的问题是为什么我没有得到这些消息在窗口,为什么我一直得到他们,即使我改变我的回调
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE , 0, nullptr, GL_TRUE);
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH_AMD , 0, nullptr, GL_TRUE);
?它们对我来说似乎是有信息的,但从这个角度来看,它们大多是噪音
我的问题是为什么我没有得到这些消息在windows
调试消息完全是特定于实现的。在最坏的情况下,你根本收不到任何消息。不同驱动程序的冗长程度可能差别很大,Linux上的桌面开源驱动程序明显处于冗长程度的一端。英伟达的Win/Linux在这方面也很好,但AMD和英特尔在windows上的表现却很差。
为什么我一直得到他们,即使我改变我的回调从[…])
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH_AMD , 0, nullptr, GL_TRUE);
因为glDebugMessageControl(..., GL_DEBUG_SEVERITY_HIGH_AMD, ..., GL_TRUE)
只是启用SEVERITY_HIGH
消息(无论如何之前启用),它不会禁用默认情况下仍然启用的SEVERITY_NOTIFICATION
,如GL_KHR_debug
扩展规范中所述(调试输出扩展的其他变体如AMD的类似):
消息可以启用或禁用。将不会生成禁用的消息。所有消息初始化除非他们的严重性是
DEBUG_SEVERITY_LOW
。可以使用DebugMessageControl
命令更改消息的启用状态。