проблема с glDebugMessageCallback в Windows 10 с использованием freeglut - PullRequest
1 голос
/ 28 октября 2019

Я хотел бы использовать функцию `glDebugMessageCallback 'в качестве помощи для отладки моей программы openGL. Я реализовал свой обратный вызов отладки как:

void MyDbgCallback(GLenum source, GLenum type, GLenum id, GLenum severity, GLsizei length, const GLchar* msg, GLvoid* user)
{
    fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), type, severity, msg);
}

, как показано в примере, расположенном здесь: https://www.khronos.org/opengl/wiki/Debug_Output Кроме того, во время инициализации я включил следующие две строки:

// Enable debugging output
glEnable(GL_DEBUG_OUTPUT);
glDebugMessageCallback(MyDbgCallback, 0);

Теперь при компиляции (VS2015) я получаю следующее сообщение об ошибке:

1>error C2664: 'void (GLDEBUGPROC,const void *)': cannot convert argument 1 from 'overloaded-function' to 'GLDEBUGPROC'
1> note: None of the functions with this name in scope match the target type

При поиске в Интернете (включая этот сайт) я видел несколько постов, что последний аргумент в функции обратного вызовадолжно быть const GLvoid* user, и я пробовал оба способа с одной и той же ошибкой.

Наведение над волнисто-красными линиями в IDE я получаю следующее сообщение: "аргумент типа void () (GLenum souce, тип GLenum, идентификатор GLenum, серьезность GLenum, длина GLsizei, const GLchar msg, GLvoid * user) несовместим с параметром типа GLDEBUGPROC ". Теперь, просматривая заголовочные файлы, я обнаружил GLDEBUGPROC, объявленный в строке 2709 из glcorearb.h, и он объявлен как:

typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam);

, что выглядит идентично используемой мной функции DbgCallback. Что мне не хватает? Что мне нужно сделать, чтобы заставить это работать на Windos 10

1 Ответ

1 голос
/ 28 октября 2019

Часть APIENTRY объявления функции не является обязательной. Ваша функция не предоставляет этот спецификатор, который, вероятно, вынуждает компилятор использовать соглашения о вызовах в стиле C для функции, чего ожидал бы вызывающий этот обратный вызов. Позднее компилятор пытается спасти вас от трудных для отладки ошибок.

Кроме того, вы не должны перегружать обратные вызовы, подобные этой. Достаточно одного определения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...