OpenGL调试上下文性能警告

AzP*_*AzP 14 opengl opengl-3

我已经设法实现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]
Run Code Online (Sandbox Code Playgroud)

我知道自从上次编译着色器以来,它与OpenGL状态有关.

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

这可能不是什么大问题,因为它只发生在上下文创建时,但是我们运行了很多上下文(至少同时有15个上下文),所以看看我是否能够修复警告会很有趣并一劳永逸地摆脱它.

小智 10

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


pos*_*ism 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
}
Run Code Online (Sandbox Code Playgroud)