La suppression des erreurs opengl provoque une exception

la programmation


Quand j’appelle

while (glGetError() != GL_NO_ERROR);

il donne l’exception suivante :

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

Et mon code de vérification des erreurs ressemble à ceci :

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

Et je l’appelle après avoir appelé

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

glViewport(0, 0, 640, 480);

. Et il semble qu’OpenGL soit correctement initialisé comme je l’ai vérifié en imprimant la chaîne GL_VERSION.
Vraiment déroutant, pas grand chose d’autre à dire.

Ce que j’ai essayé :

J’ai seulement essayé de changer mon code d’initialisation, mais cela a également échoué.
Encore une fois, on ne sait pas vraiment quoi faire, donc je ne peux presque rien faire.

Solution 1

C’est plutôt étrange. Principalement parce que j’ai beaucoup travaillé avec OpenGL et c’est quelque chose que je n’ai jamais jugé nécessaire de faire. Vous pourriez avoir plus de succès à découvrir quelles étaient les erreurs et à les corriger. J’ai écrit cette fonction il y a quelque temps et elle m’a été utile. Il génère une chaîne de texte pour le dernier code d’erreur. C’est ici :

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

Une mise en garde : il utilise la bibliothèque GLU pour générer une chaîne d’erreur pour le message. Cela génère une chaîne de texte avec un message défini par l’utilisateur ainsi qu’une description textuelle de l’erreur. Voici un exemple de code qui l’appelle :

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

Notez qu’il accepte des arguments variables afin que vous puissiez transmettre pratiquement tout ce qui peut être affiché. À partir de là, vous pouvez faire ce que vous voulez avec la chaîne du message, par exemple l’envoyer à un débogueur, la consigner dans un fichier, l’afficher sur une console, etc.

コメント

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