OpenGL调试上下文性能警告

15

我已经成功实现了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个),所以有趣的是看看能否修复警告并彻底摆脱它。


5
我总是在NVIDIA显卡上收到这个警告。我不知道它意味着什么,也不知道该如何纠正它。到目前为止,NVIDIA似乎不太愿意解释问题所在。 - Nicol Bolas
我从论坛上阅读到的信息也给我留下了同样的印象。人们谈论驱动程序错误等问题。 - AzP
这不是一个 bug;只是有关着色器重新编译的性能警告。 - Nicol Bolas
嗯,Nicol,那很明显。但是NVidia似乎仍然不想在这个问题上提供更多信息。我看到一个帖子中提到了驱动程序问题,好像他们是实际的驱动程序开发人员一样。 当我说“驱动程序错误”时,我的意思是指消息弹出的事实,而不是消息本身是一个错误。 - AzP
你是否收到了特定着色器的警告?能否将其发布出来?如果没有,且它是针对上下文的,那么你的上下文是否有任何不同? - starmole
似乎是每个上下文只有一次,且适用于我们所有的上下文。但你关于它是否针对特定着色器的问题非常有趣!我得去查一下。 - AzP
2个回答

13
我通过在绘制一些几何图形后调用glUseProgram(0)来消除该消息,否则下一个带有programId的glUseProgram()将触发该消息。

当我最终尝试时,这对我起作用了!我可以通过回溯跟踪警告的来源,添加一些glUseProgram(0),然后所有警告都消失了。 - AzP

5

根据我所能找到的少量信息(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也能提供一些反馈,那将会很有趣。 - AzP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接