7

glGetError()最初の関数呼び出しでエラーが最初にOpenGLによって報告されるという、バイナリ検索の形式を使用して絞り込むために、条件付き印刷とチェックを挿入するのに長い時間がかかる場合があります。

失敗する可能性のあるすべてのGL呼び出しをラップアラウンドできるマクロを作成する方法があれば、それはクールだと思います。このマクロは、glGetError直後に条件付きで呼び出されます。特別なターゲット用にコンパイルする場合glGetError、非常に細かい粒度でチェックすることができますが、通常のリリースまたはデバッグ用にコンパイルすると、これは有効になりません(1フレームに1回だけチェックします)。

これは意味がありますか?これを少し検索すると、glGetError描画されていないすべてのgl-callの後に呼び出すことを推奨している人が何人かいます。これは、基本的に私が説明していることと同じです。

したがって、この場合、gl呼び出しをこのようにインストルメント化するプロセスを簡素化するために私ができる賢いことはありますか(コンテキスト:GLEWを使用しています)?この時点で、各OpenGL関数呼び出しの周りにマクロをラップするようにコードを変換するのはかなりの量の作業になります。コードのどのセクションをインストルメント化するかを手動で決定せずに、何か賢いことをしてこれらすべてを実行できれば素晴らしいことです(ただし、これにも潜在的な利点があります...しかし実際にはそうではありません。パフォーマンスについては本当に気にしません。エラーの原因をデバッグしているときまでに)。

4

2 に答える 2

16

これを試して:

void CheckOpenGLError(const char* stmt, const char* fname, int line)
{
    GLenum err = glGetError();
    if (err != GL_NO_ERROR)
    {
        printf("OpenGL error %08x, at %s:%i - for %s\n", err, fname, line, stmt);
        abort();
    }
}

#ifdef _DEBUG
    #define GL_CHECK(stmt) do { \
            stmt; \
            CheckOpenGLError(#stmt, __FILE__, __LINE__); \
        } while (0)
#else
    #define GL_CHECK(stmt) stmt
#endif

次のように使用します。

GL_CHECK( glBindTexture2D(GL_TEXTURE_2D, id) );

OpenGL関数が変数を返す場合は、GL_CHECKの外部で宣言することを忘れないでください。

const char* vendor;
GL_CHECK( vendor = glGetString(GL_VENDOR) );

このようにして、_DEBUGプリプロセッサシンボルが定義されているかどうかをデバッグチェックしますが、「リリース」ビルドでは、生のOpenGL呼び出しのみが行われます。

于 2012-06-29T08:29:36.070 に答える
1

BuGLeそれはあなたが望むことをするように聞こえます:

  • 行われたすべてのGL呼び出しのテキストログをダンプします。
  • スクリーンショットを撮るか、ビデオをキャプチャします。
  • 各呼び出しglGetErrorの後に呼び出してエラーをチェックし、このチェックがプログラムに対して透過的になるようにglGetErrorをラップします。
  • 統計(フレームレートなど)をキャプチャして表示します
  • ワイヤフレームモードを強制する
  • ドライバーがシンボルなしでコンパイルされている場合でも、ドライバー内のセグメンテーション違反からバックトレースを回復します。
于 2012-06-29T06:11:27.663 に答える