يؤدي مسح أخطاء opengl إلى حدوث استثناء


عندما أتصل

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

. ويبدو أنه تمت تهيئة OpenGL بشكل صحيح كما قمت بالتحقق من خلال طباعة سلسلة GL_VERSION.
مربك حقا، وليس هناك الكثير ليقوله.

ما حاولت:

لقد حاولت فقط تغيير رمز التهيئة الخاص بي، ولكن ذلك فشل أيضًا.
مرة أخرى، من غير الواضح تمامًا ما يجب فعله لذلك بالكاد أستطيع فعل أي شيء.

الحل 1

وهذا أمر غريب إلى حد ما. في الغالب لأنني عملت على نطاق واسع مع OpenGL وهذا شيء لم أجد ضرورة للقيام به على الإطلاق. قد تحقق نجاحًا أفضل في اكتشاف الأخطاء وإصلاحها. لقد كتبت هذه الوظيفة منذ فترة وكانت مفيدة بالنسبة لي. يقوم بإنشاء سلسلة نصية لرمز الخطأ الأخير. ها هو :

سي ++
///////////////////////////////////////////////////////////////////////////////
// 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 لإنشاء سلسلة خطأ للرسالة. يؤدي هذا إلى إنشاء سلسلة نصية تحتوي على رسالة محددة من قبل المستخدم بالإضافة إلى وصف نصي للخطأ. فيما يلي عينة من التعليمات البرمجية التي تسميها:

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

لاحظ أنه يقبل الوسائط المتغيرة حتى تتمكن عمليًا من تمرير أي شيء يمكن عرضه. من هناك يمكنك أن تفعل ما تريد باستخدام سلسلة الرسالة مثل إرسالها إلى مصحح الأخطاء، أو تسجيلها في ملف، أو عرضها على وحدة التحكم، وما إلى ذلك.

コメント

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