Xóa lỗi opengl gây ra ngoại lệ

lập trình


Khi tôi gọi

while (glGetError() != GL_NO_ERROR);

nó đưa ra ngoại lệ sau:

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

Và mã kiểm tra lỗi của tôi là như thế này:

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

Và tôi gọi nó sau khi gọi

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

glViewport(0, 0, 640, 480);

. Và có vẻ như OpenGL được khởi tạo chính xác khi tôi kiểm tra bằng cách in ra chuỗi GL_VERSION.
Thực sự rất khó hiểu, không còn gì để nói.

Những gì tôi đã thử:

Tôi mới thử thay đổi mã khởi tạo của mình, tuy nhiên điều đó cũng không thành công.
Một lần nữa, tôi không rõ phải làm gì nên tôi hầu như không thể làm được gì.

Giải pháp 1

Điều này khá kỳ quặc. Chủ yếu là vì tôi đã làm việc nhiều với OpenGL và đây là điều tôi chưa bao giờ thấy cần thiết phải làm. Bạn có thể thành công hơn trong việc tìm ra lỗi và sửa chúng. Tôi đã viết chức năng này cách đây một thời gian và nó rất hữu ích cho tôi. Nó tạo ra một chuỗi văn bản cho mã lỗi cuối cùng. Đây là:

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

Một lưu ý: nó sử dụng thư viện GLU để tạo chuỗi lỗi cho thông báo. Điều này tạo ra một chuỗi văn bản có thông báo do người dùng xác định cùng với mô tả bằng văn bản về lỗi. Đây là một mẫu mã gọi nó:

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

Lưu ý rằng nó chấp nhận các đối số có thể thay đổi nên thực tế bạn có thể chuyển bất kỳ thứ gì có thể được hiển thị. Từ đó, bạn có thể làm những gì bạn muốn với chuỗi thông báo, chẳng hạn như gửi nó đến trình gỡ lỗi, ghi nó vào một tệp, hiển thị trên bảng điều khiển, v.v.

コメント

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