【解決方法】opengl エラーをクリアすると例外が発生する


電話すると

while (glGetError() != GL_NO_ERROR);

次の例外が発生します。

Exception thrown at 0x00000000 in Application.exe: 0xC0000005: Access violation executing location 0x00000000.

そして、私のエラーチェックコードは次のようになります。

#pragma once
#include <glad/glad.h>
#include <iostream>

#define ASSERT(x) if (!(x)) __debugbreak();
#define GLCall(x) GLClearError(); x; ASSERT(GLLogCall(#x, __FILE__, __LINE__));

static void GLClearError();
static bool GLLogCall(const char* function, const char* file, int line);

static void GLClearError()
{
    while (glGetError() != GL_NO_ERROR);
}

static bool GLLogCall(const char* function, const char* file, int line)
{
    GLenum error = glGetError();

    if (error)
    {
        std::cout << "GL Error of type (" << error << ") at " << function << 
            " in file: " << file <<
            " called on line: " << line << std::endl;
        return false;
    }

    return true;
}

そして、私は電話した後に電話します

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{	
std::cout << "Failed to initialize GLAD" << std::endl;
	return -1;
}

glViewport(0, 0, 640, 480);

。 GL_VERSION 文字列を出力して確認したところ、OpenGL は正しく初期化されているようです。
本当に混乱するので、他に言うことはありません。

私が試したこと:

初期化コードを変更しようとしただけですが、それも失敗しました。
繰り返しますが、何をすればよいのか非常に不明確なので、ほとんど何もすることができません。

解決策 1

これはかなり奇妙です。 その主な理由は、私が OpenGL を広範囲に使用してきましたが、これが必要だと感じたことがないからです。 エラーの内容を特定して修正すると、よりうまくいく可能性があります。 この関数は少し前に書きましたが、とても役に立ちました。 最後のエラー コードのテキスト文字列を生成します。 ここにあります :

C++
///////////////////////////////////////////////////////////////////////////////
// generate an error string from the last OpenGL error along with a formatted message

int GetGLerrorMsg( PSTR buffer, int bufferSize, PCSTR format, ... )
{
    va_list args;
    va_start( args, format );

    int amount = vsnprintf( buffer, bufferSize, format, args );

    GLenum errorno = glGetError();
    if( errorno != GL_NO_ERROR )
        _sntprintf( buffer + amount, bufferSize - amount, " - %d: %s",
                    errorno, (PCSTR) gluErrorString( errorno ) );

    va_end( args );
    return errorno;
}

注意点が 1 つあります。GLU ライブラリを使用してメッセージのエラー文字列を生成します。 これにより、ユーザー定義のメッセージとエラーのテキスト説明を含むテキスト文字列が生成されます。 これを呼び出すコードのサンプルを次に示します。

C++
GetGLerrorMsg( buffer, bufferSize, "Call of wglCreateContext failed : " );

可変引数を受け入れるため、表示できるものは実質的にすべて渡すことができることに注意してください。 そこから、メッセージ文字列をデバッガに送信したり、ファイルに記録したり、コンソールに表示したりするなど、メッセージ文字列を使用して必要な操作を行うことができます。

コメント

タイトルとURLをコピーしました