跳转到内容

OpenGL 编程/调试

来自维基教科书,开放世界中的开放书籍

如果您使用的是 Mesa OpenGL 实现,您可以设置以下环境变量

  • LIBGL_ALWAYS_SOFTWARE=1 : 使用软件实现,完全不使用图形卡。当您
    • 怀疑驱动程序中的错误时,
    • 想要尝试另一种实现(就像使用不同的图形卡一样),
    • 想要检查图形故障是由于内存未初始化还是编程错误造成的。
  • MESA_DEBUG=1 : 在错误情况下会输出诊断消息(例如,在程序未链接时分配统一变量)。

另请参阅 Mesa 的 调试环境变量 页面。

常见错误

[编辑 | 编辑源代码]

如果您手动绘制线条或三角形,但没有任何显示

  • 检查您的第四个坐标是否为 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;
	}

模板缓冲区

[编辑 | 编辑源代码]

有关如何调试模板缓冲区的提示,您可以查看 模板缓冲区 部分。

< OpenGL 编程

浏览和下载 完整代码
华夏公益教科书