OpenGL 中的错误处理
OpenGL API 的许多功能非常有用和强大。但是, OpenGL程序很可能包含错误。因此,学习 OpenGL 程序中的错误处理变得很重要。 OpenGL 和 GLU 库有一种记录错误的简单方法。当 OpenGL 程序在调用基础库例程或 GLU 例程时遇到错误时,它会在内部记录一个错误代码,并忽略导致错误的例程。虽然,OpenGL 在任何给定时间只记录一个错误代码。 OpenGL 使用自己的方法来检测错误。一旦发生错误,在程序明确查询OpenGL错误状态之前,不会记录其他错误代码。
句法:
GLenum code;
code = glGetError ();
此函数调用返回当前错误代码并清除内部错误标志:
- 如果返回值等于GLNOERROR OpenGL 符号常量,则一切正常。
- 如果有任何其他返回值,则表明发生了问题。
基本的 OpenGL 库为许多表示不同错误条件的符号常量提供了定义。 GLU 库还定义了许多错误代码,但其中大多数都具有几乎毫无意义的名称,例如GLUNURBSERROR1 、 GLUNURBSERROR2等。
GLU 库包含一个函数,该函数为每个 GLU 和 GL 错误返回一个描述性字符串。要使用它,首先检索当前错误代码,然后将其作为参数传递给此函数。可以使用 C 标准库函数(如 fprintf()函数)打印返回值。
下面是实现上述方法的代码片段:
C
#include
GLenum code;
const GLubyte* string;
code = glGetError();
string = gluErrorString(code);
fprintf(stderr, "OpenGL error: %s\n", string);
C
// C program for the above approach
#include
GLenum errorCheck()
{
GLenum code;
const GLubyte* string;
code = glGetError();
if (code != GL_NO_ERROR) {
string = gluErrorString(code);
fprintf(stderr, "OpenGL error: %s\n", string);
}
return code;
}
说明: gluErrorString返回的值指向位于 GLU 库内的字符串。由于它不是动态分配的字符串,因此它不能被程序显式释放。此外,它不能被程序修改(因此,字符串声明上的 const 修饰符)。很容易将这些函数调用封装到程序中的通用错误报告函数中。
下面给出的函数将检索当前错误代码,打印描述性错误字符串,并将代码返回给调用例程:
C
// C program for the above approach
#include
GLenum errorCheck()
{
GLenum code;
const GLubyte* string;
code = glGetError();
if (code != GL_NO_ERROR) {
string = gluErrorString(code);
fprintf(stderr, "OpenGL error: %s\n", string);
}
return code;
}
说明:默认情况下, glGetError只打印错误编号,除非已经记住错误代码,否则不容易理解。因此,编写一个小的辅助函数来轻松打印错误字符串以及错误检查函数的调用位置通常是有意义的:
GLenum glCheckError_(const char *file, int line)
{
GLenum errorCode;
while ((errorCode = glGetError()) != GL_NO_ERROR)
{
std::string error;
switch (errorCode)
{
case GL_INVALID_ENUM: error = “INVALID_ENUM”; break;
case GL_INVALID_VALUE: error = “INVALID_VALUE”; break;
case GL_INVALID_OPERATION: error = “INVALID_OPERATION”; break;
case GL_STACK_OVERFLOW: error = “STACK_OVERFLOW”; break;
case GL_STACK_UNDERFLOW: error = “STACK_UNDERFLOW”; break;
case GL_OUT_OF_MEMORY: error = “OUT_OF_MEMORY”; break;
case GL_INVALID_FRAMEBUFFER_OPERATION: error = “INVALID_FRAMEBUFFER_OPERATION”; break;
}
std::cout << error << ” | ” << file << ” (” << line << “)” << std::endl;
}
return errorCode;
}
#define glCheckError() glCheckError_(__FILE__, __LINE__)
如果这些glCheckError调用中的任何一个在我们的数据库中分组,那么更准确地知道哪个glCheckError调用返回了错误会很有帮助。
glBindBuffer(GL_VERTEX_ARRAY, vbo);
glCheckError();
输出示例:
想要从精选的视频和练习题中学习,请查看C 基础到高级C 基础课程。