Недавно я пытался реализовать автоматическую проверку ошибок после каждого вызова функции OpenGL.Я подумал об обёртывании каждой функции OpenGL в вызывающей стороне следующим образом:
CheckForErrors(glCreateBuffers(1, &VBO));
Но я увидел, что GLEW уже использует свою собственную оболочку функции:
#define GLEW_GET_FUN(x) x
Поэтому я решил отредактировать её вместопишу свой собственный упаковщик функций:
#ifndef GLEW_GET_FUN
#ifdef DEBUG
#define GLEW_GET_FUN(x) while (glGetError() != GL_NO_ERROR);\
x; {\
GLenum error = glGetError();\
if (error != GL_NO_ERROR) {\
printf("[GLEW]: OpenGL error(s) occured while calling %s in %s (line %s):", #x, __FILE__, __LINE__);\
do printf(" %d", error); while (error = glGetError());\
printf("\n");\
__debugbreak();\
}
#else
#define GLEW_GET_FUN(x) x
#endif
#endif
К сожалению, это не компилируется.Например, вызов этой функции:
GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
Получает от препроцессора значение, измененное на это:
GLuint vertexShaderID = while (glGetError() != GL_NO_ERROR); __glewCreateShader; { GLenum error = glGetError(); if (error != 0) { printf("[GLEW]: OpenGL error(s) occured while calling %s in %s (line %s):", "__glewCreateShader", "main.cpp", 51); do printf(" %d", error); while (error = glGetError()); printf("\n"); __debugbreak(); }(GL_VERTEX_SHADER);
Здесь есть 2 проблемы:
- Оператор начинаетсяс циклом while, поэтому он не может вернуть значение.
- Скобки с параметрами функции ставятся после всего, а не сразу после вызова функции.
Я незнаю, как преодолеть эти проблемы, и я буду признателен за помощь.
Примечания
- Мне известна функция
glDebugMessageCallback()
, но она доступна только в OpenGL 4.3+, которая являетсядовольно новая и частично неподдерживаемая, но версия. - Я не могу удалить цикл while в начале, потому что мне нужно очистить все ошибки перед вызовом функции (если нет другого способа сделать это).
- Я пытаюсь сделать что-то вроде this , но без использования отдельной функции-оболочки.