清除opengl错误导致异常

[ad_1]

当我打电话时

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;
}

需要注意的是:它使用 GLU 库为消息生成错误字符串。 这会生成一个文本字符串,其中包含用户定义的消息以及错误的文本描述。 以下是调用它的代码示例:

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

请注意,它接受变量参数,因此您几乎可以传递任何可以显示的内容。 从那里,您可以对消息字符串执行您想要的操作,例如将其发送到调试器、将其记录到文件、显示在控制台上等。

[ad_2]

コメント

标题和URL已复制