gpt4 book ai didi

c - 如何使用 GLEW 进行自动 OpenGL 错误检查?

转载 作者:行者123 更新时间:2023-11-30 14:41:39 24 4
gpt4 key购买 nike

我最近尝试在每次 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);

这里有两个问题:

  1. 该语句以 while 循环开头,因此无法返回值。
  2. 带函数参数的括号放在整个内容之后,而不是紧接在函数调用之后。

我不知道如何克服这些问题,我将不胜感激。

注释

  • 我知道 glDebugMessageCallback() 函数,但它仅在 OpenGL 4.3+ 中可用,这是一个相当新且部分不受支持的版本。
  • 我无法在开始时删除 while 循环,因为我必须在调用该函数之前清除所有错误(除非有不同的方法来执行此操作)。
  • 我正在尝试做类似 this 的事情,但不使用单独的函数包装器。

最佳答案

I don't know how to overcome those problems

你不能。你想做的事情根本无法按照你想要的方式去做。您不能将表达式(这就是函数调用)转换为语句(或者更确切地说,一系列语句)并使其在任何地方都有效。它仅在表达式用作语句的情况下才有效。

如果您不愿意定期将错误检查代码插入到应用程序中,并且无法使用现代调试消息传递 API,那么标准解决方案是使用外部工具来查找和报告错误。例如,RenderDoc 可以检测 OpenGL 错误。它允许您记录每个 OpenGL 调用,并可以在错误发生时报告错误。

关于c - 如何使用 GLEW 进行自动 OpenGL 错误检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54846102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com