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 个)所以看看我是否能够修复警告会很有趣并一劳永逸地摆脱它。

4

2 回答 2

13

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

于 2013-02-26T00:51:41.677 回答
5

我能找到的少量信息来看,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
}
于 2012-11-02T18:27:36.803 回答