OpenGL 调试上下文性能警告

Posted

技术标签:

【中文标题】OpenGL 调试上下文性能警告【英文标题】:OpenGL Debug Context performance warning 【发布时间】:2012-08-13 19:40:27 【问题描述】:

我已经成功实现了 OpenGL 调试上下文(太棒了,终于!),大多数事情看起来都很好,但是我看到了一个性能警告,我无法找到很好的信息。

[   0.0330 - 388.6340] OpenGL Version: 4.2.0 Quadro 600/PCIe/SSE2 NVIDIA Corporation
[   0.0000 - 549.1920] OpenGL: Program/shader state performance warning: Fragment Shader is going to be recompiled because the shader key based on GL state mismatches. [source=API type=PERFORMANCE severity=MEDIUM id=131218]

我确实明白,自从我上次编译着色器以来,OpenGL 状态发生了变化。

我们有四个着色器,它们在上下文之间共享的纹理上运行,并且错误信息仅在创建新上下文后显示。因此,上下文创建可能会改变 OpenGL 状态机的状态。是否有可能甚至无法解决它,因为每个上下文都以自己的“干净”状态机开始?

这可能没什么大不了的,因为它只发生在上下文创建时,但我们正在运行许多上下文(至少同时最多 15 个)所以看看我是否能够很有趣修复警告并一劳永逸地消除它。

【问题讨论】:

总是在 NVIDIA 卡上收到此警告。我不知道这意味着什么,也不知道如何纠正它。到目前为止,NVIDIA 似乎并不热衷于解释问题所在。 我在论坛上读到它时也有同样的印象。人们谈论驱动程序错误等。 这不是一个错误;这只是关于着色器重新编译的性能警告。 好吧,Nicol,这很明显。但 NVidia 似乎仍然不想就此事提供更多信息。我看到一个帖子他们提到了驱动程序问题,就好像他们是真正的驱动程序开发人员一样。当我说“驱动程序错误”时,我的意思是消息正在弹出,而不是消息本身就是错误。 您是否收到针对特定着色器的警告?你能发帖吗?如果不是,而且是针对上下文,您的上下文有什么不同吗? 【参考方案1】:

我在完成绘制一些几何图形后调用 glUseProgram(0) 消除了该消息,否则下一个带有 programId 的 glUseProgram() 会触发该消息。

【讨论】:

当我终于尝试它时,这对我有用!我可以通过回溯追踪警告的来源,添加几个 glUseProgram(0),所有警告都消失了。【参考方案2】:

来自what little info I've been able to find,NVIDIA 希望您在着色器编译时的一些 OpenGL 状态与着色器绑定并用于渲染时的状态相匹配。

就个人而言,在我们获得更多信息之前,我只是在我的调试回调函数中过滤掉这个特定的消息:

static void CALLBACK DebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, GLvoid *userParam)

    // Suppress some useless warnings
    switch(id)
    
    case 131218: // NVIDIA: "shader will be recompiled due to GL state mismatches"
        return;
    default:
        break;
    

    // Print/handle message as usual

【讨论】:

谢谢!我还没有看到那个线程的最后一部分。看看 Nvidia 是否也对此提供一些反馈会很有趣。

以上是关于OpenGL 调试上下文性能警告的主要内容,如果未能解决你的问题,请参考以下文章

CGContextRef 作为 OpenGL 上下文

使用 SDL2 和 xcode 4.6。我设法创建了一个 OpenGL 3.2 核心上下文。但是不能使用 glsl 1.50

OpenGL ES基础理论 (一) —— 缓存、帧缓存、上下文与坐标系等

不同的opengl上下文是不是有不同的opengl扩展?

有效的 OpenGL 上下文

SDL OpenGL 应用程序在发布模式下崩溃 [重复]