Menghapus kesalahan opengl menyebabkan pengecualian

pemrograman


Ketika saya menelepon

while (glGetError() != GL_NO_ERROR);

itu memberikan pengecualian berikut:

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

Dan kode pengecekan kesalahan saya adalah seperti ini:

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

Dan saya meneleponnya setelah menelepon

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

glViewport(0, 0, 640, 480);

. Dan sepertinya OpenGL diinisialisasi dengan benar saat saya memeriksa dengan mencetak string GL_VERSION.
Benar-benar membingungkan, tidak banyak lagi yang bisa dikatakan.

Apa yang saya coba:

Saya hanya mencoba mengubah kode inisialisasi, namun gagal juga.
Sekali lagi, sangat tidak jelas apa yang harus saya lakukan sehingga saya hampir tidak dapat melakukan apa pun.

Solusi 1

Ini agak aneh. Terutama karena saya telah bekerja secara ekstensif dengan OpenGL dan ini adalah sesuatu yang menurut saya tidak perlu dilakukan. Anda mungkin akan lebih berhasil dalam mencari tahu apa kesalahannya dan memperbaikinya. Saya menulis fungsi ini beberapa waktu lalu dan ini berguna bagi saya. Ini menghasilkan string teks untuk kode kesalahan terakhir. Ini dia :

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

Satu peringatan: ia menggunakan perpustakaan GLU untuk menghasilkan string kesalahan untuk pesan tersebut. Ini menghasilkan string teks dengan pesan yang ditentukan pengguna bersama dengan deskripsi tekstual kesalahan tersebut. Berikut adalah contoh kode yang memanggilnya:

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

Perhatikan bahwa ia menerima argumen variabel sehingga Anda dapat meneruskan apa pun secara praktis yang dapat ditampilkan. Dari sana Anda dapat melakukan apa pun yang Anda inginkan dengan string pesan seperti mengirimkannya ke debugger, mencatatnya ke file, menampilkannya di konsol, dll.

コメント

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