Borrar errores de OpenGL provoca una excepción

programación


cuando llamo

while (glGetError() != GL_NO_ERROR);

da la siguiente excepción:

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

Y mi código de verificación de errores es así:

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

Y lo llamo después de llamar

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

glViewport(0, 0, 640, 480);

. Y parece que OpenGL está inicializado correctamente, según lo verifiqué imprimiendo la cadena GL_VERSION.
Realmente confuso, no hay mucho más que decir.

Lo que he probado:

Solo intenté cambiar mi código de inicialización, sin embargo, eso también falló.
Nuevamente, no está muy claro qué hacer, por lo que apenas puedo hacer nada.

Solución 1

Esto es bastante extraño. Principalmente porque he trabajado extensamente con OpenGL y esto es algo que nunca consideré necesario hacer. Es posible que tenga más éxito al descubrir cuáles fueron los errores y corregirlos. Escribí esta función hace un tiempo y me ha resultado útil. Genera una cadena de texto para el último código de error. Aquí lo tienes :

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

Una advertencia: utiliza la biblioteca GLU para generar una cadena de error para el mensaje. Esto genera una cadena de texto con un mensaje definido por el usuario junto con una descripción textual del error. Aquí hay un ejemplo de código que lo llama:

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

Tenga en cuenta que acepta argumentos variables para que pueda pasar prácticamente cualquier cosa que pueda mostrarse. Desde allí, puede hacer lo que quiera con la cadena del mensaje, como enviarla a un depurador, registrarla en un archivo, mostrarla en una consola, etc.

コメント

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