OpenGL 编程/调试
外观
如果您使用的是 Mesa OpenGL 实现,您可以设置以下环境变量
- LIBGL_ALWAYS_SOFTWARE=1 : 使用软件实现,完全不使用图形卡。当您
- 怀疑驱动程序中的错误时,
- 想要尝试另一种实现(就像使用不同的图形卡一样),
- 想要检查图形故障是由于内存未初始化还是编程错误造成的。
- MESA_DEBUG=1 : 在错误情况下会输出诊断消息(例如,在程序未链接时分配统一变量)。
如果您手动绘制线条或三角形,但没有任何显示
- 检查您的第四个坐标是否为 1 而不是 0
- 检查您是否正确设置了 glEnableVertexAttribArray / glBindBuffer / glVertexAttribPointer
- 仔细检查您使用的变量是否正确(错误的复制粘贴...) - 避免使用全局变量以帮助解决此问题
- 仔细检查您的
glUniform*
调用,包括类型 (3fv, 4fv...) - OpenGL 非常严格 并且 不会发出任何提示 - 注意 glDrawElements 的第四个也是最后一个参数 (
indices
) 是指从起始位置偏移的字节数,而不是从起始位置开始的元素数量,即使在使用 IBO 时也是如此。
OpenGL 使用 glGetError() 来报告错误。
switch (glGetError()) {
case GL_NO_ERROR:
cerr << "GL_NO_ERROR" << endl;
break;
case GL_INVALID_ENUM:
cerr << "GL_INVALID_ENUM" << endl;
break;
case GL_INVALID_VALUE:
cerr << "GL_INVALID_VALUE" << endl;
break;
case GL_INVALID_OPERATION:
cerr << "GL_INVALID_OPERATION" << endl;
break;
case GL_INVALID_FRAMEBUFFER_OPERATION:
cerr << "GL_INVALID_FRAMEBUFFER_OPERATION" << endl;
break;
case GL_OUT_OF_MEMORY:
cerr << "GL_OUT_OF_MEMORY" << endl;
break;
}
有关如何调试模板缓冲区的提示,您可以查看 模板缓冲区 部分。
- 着色器调试 在 GLSL 维基教科书中(关于使用颜色进行调试)
- 调试 Android NDK 用于调试 Android 上的 OpenGL NDK 应用程序
浏览和下载 完整代码