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の状態が変更されていることに関係していることは理解しています。

コンテキスト間で共有されるテクスチャ上で実行されている4つのシェーダーがあり、エラー情報は新しいコンテキストが作成された後にのみ表示されます。したがって、おそらくコンテキストの作成により、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 に答える