什么时候应该调用 glGetError?

2024-04-13

glLoadIdentity http://www.opengl.org/sdk/docs/man/xhtml/glLoadIdentity.xml says

GL_INVALID_OPERATION如果生成glLoadIdentity之间执行 执行glBegin和 相应的执行glEnd.

But GL_INVALID_OPERATION是一个标志返回gl获取错误 http://msdn.microsoft.com/en-us/library/dd373546(VS.85).aspx.

我的问题是,我们什么时候应该打电话glGetError(为了知道我们是否按正确的顺序调用opengl)?


我不确定您的问题是否是关于何时可以在 glBegin/End 内调用 glGetError 或者这是否是关于 glGetError 一般用法的更普遍的问题。所以我会回答两个。

在 glBegin 和 glEnd 之间可以做的事情非常有限。这是故意的,因为您将 GL 置于非常特定的模式 - 在平局中间。因此,任何与每个顶点属性不直接相关的内容都是无效的。即使是 glGetError 在这种情况下也是无效的。尝试将 glBegin+之间的所有 GL 调用+glEnd 视为对 GL 的单个 Draw 调用,这有助于更接近 GL 真正所做的事情。

现在,如果您坚持仅调用属性方法(glNormal、glTexCoord、glColor、glSecondaryColor、glIndex、glMultiTexCoord、glVertexAttrib、glVertex 和其他一些方法)的简单规则,那么在 Begin/End 对内,您永远不会真正触发 GL 错误)。其他任何事情都会触发错误。 (呃...好吧,glMaterial 是一个例外。它可以工作,但不鼓励使用它)

如果您的问题是当错误在 Begin/End 对内触发时何时可以调用 glGetError,ChrisF 在评论中回答:在 glEnd 调用之后。

现在,从更广泛的意义上来说,仅使用 glGetError 作为调试工具。我个人的偏见有两个:

  • 每帧检查一次 glGetError 以确保没有错误
  • 使用可以检查 GL 错误代码的宏包装大多数 GL 调用,并且仅在每帧检查失败时才将其打开。

当然,既然可以调用属性方法outside一对开始/结束,要让它们正确有点棘手。但实际上,这些方法无论如何都不会失败,所以我懒得去宏观检查它们。

趣闻:GL API 最初设计的目的是让客户端实现实际上不知道调用站点是否存在错误。例如。如果 GL 实际上是在远程计算机中实现的(就像在 SGI 时代一样),那么对目标不是 GL_TEXTURE_ENV 的 glTexEnv 的调用可以简单地添加到命令缓冲区中,并且此时不会记录任何错误。

如果您随后调用 glGetError,则客户端必须将命令缓冲区刷新到 GL 服务器,等待处理缓冲的命令,获取错误代码,并将适当的错误代码返回给应用程序。

如果这听起来很沉重,那是因为事实确实如此。顺便说一下,这就是为什么不是每个调用都返回错误代码的主要原因,也是为什么调用 glGetError 仅被认为可以用于调试目的。如今,大多数 GL 实现都在同一进程中处理所有状态管理,因此正如我所说,这对于大多数用户来说确实是一件小事。

最后,每当我谈论开始/结束时,我觉得我需要说你可能应该考虑根本不使用它。这是使用 GL 进行绘制的性能最差的方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候应该调用 glGetError? 的相关文章

  • OpenGL alpha 测试 - 如何替换已弃用的 AlphaFunc?

    我正在尝试用 Alpha 绘制球体 但我的 Z 缓冲区有问题 有些像素是透明的 但会写入 Zbuffer 因此后面的不透明像素会被隐藏 这是我的设置 gl Enable gl DEPTH TEST gl DepthFunc gl LEQUA
  • 如何用SDL2和OpenGL画三角形?

    我正在使用 C 中的 SDL2 和 OpenGL 开发一个简单的应用程序 问题是我的程序没有绘制三角形 Rect hpp 绘制三角形的类 ifndef Rect hpp define Rect hpp include
  • 尝试 glUseProgram 时出现 Opengl 错误 1281

    我有什么想法可以调试这个opengl进一步错误 1281 我正在从文件加载源代码 编译 链接 然后尝试检查错误glUseProgram 在我的对象的绘制方法中 log info gl2 glIsProgram shaderProgram t
  • 给定焦点和相机主中心,如何创建透视投影矩阵

    我设法使用 OpenCV 获取相机的内在和外在参数 因此我有 fx fy cx 和 cy 我还有屏幕 图像的宽度和高度 但是如何根据这些参数创建 OpenGL 透视投影矩阵呢 glFrustum 展示了如何在给定 Z 近 Z 远以及图像宽度
  • libgdx 中帧缓冲区的结果不明确

    我得到以下奇怪的结果帧缓冲区 http libgdx badlogicgames com nightlies docs api com badlogic gdx graphics glutils FrameBuffer htmllibgdx
  • 静态链接库时出现 glew 链接器错误

    我正在尝试在 Visual Studio 2012 中构建一个 opengl 项目 我想静态包含 glew 库 因此我从源代码构建它并将生成的 glew32sd lib 复制到我的 lib 目录 我将此 lib 路径提供给 Visual S
  • 从文件中读取 GLSL 着色器

    我正在尝试从如下所示的文件中读取顶点和片段着色器 version 330 core in vec3 ourColor out vec4 color void main color vec4 ourColor 1 0f but when i
  • 如何将 3D 图像输出到 3D 电视?

    我有一台 3D 电视 如果我不至少尝试让它显示我自己创作的漂亮 3D 图像 我就会逃避我的责任 作为一个极客 我之前已经完成了非常基本的 OpenGL 编程 因此我了解所涉及的概念 假设我可以为自己渲染一个简单的四面体或立方体并使其旋转一点
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • OpenGL 的每个组件 alpha 通道?

    是否可以使用 OpenGL 对每个组件使用一个 alpha 通道 一个用于红色 一个用于绿色 一个用于蓝色 进行混合 如果没有 有哪些可能的解决方法 这不是直接支持的东西 不过 您自己实现起来相当容易 使用 3 通道 alpha 纹理渲染三
  • OpenGL:调试“单通道线框渲染”

    我正在尝试实现论文 单通道线框渲染 它看起来很简单 但它给了我所期望的厚暗值 论文没有给出计算海拔高度的确切代码 所以我按照自己认为合适的方式进行了操作 代码应该将三个顶点投影到视口空间中 获取它们的 高度 并将它们发送到片段着色器 片段着
  • OpenGL z轴指向哪里?

    我正在尝试了解 OpenGL 坐标系 我到处都看到它被描述为右撇子 但这与我的经验不符 我尝试绘制一些形状和 3 d 对象 我发现 z 轴显然指向 屏幕 而 x 指向右侧 y 指向上方 这是左手坐标系的描述 我缺少什么 编辑 例如 http
  • 使用 Qt 在 xoverlay 之上绘制

    我希望在使用 Xoverlay 渲染的视频流之上绘制一些 UI 我正在使用 gstreamer 播放视频并使用 xoverlay 在 xvimagesink 上渲染它 我的小部件继承自 QGLWidget 我希望使用 QPainter 绘制
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • 使用draw()而不是eventloop时的pyglet

    我正在尝试用 pyglet 画一个圆 但当我使用 draw 函数而不是 app run 循环时 它是不可见的 有什么建议我可以做什么吗 谢谢 from math import from pyglet gl import window pyg
  • 使用 C# 截取任何外部应用程序的屏幕截图

    我们有一个 C WPF 应用程序 我们想要在其中截取我们启动的任意应用程序的屏幕截图 即 我们可以引用我们启动的进程 应用程序可能已最小化或位于其他窗口后面 但我们仍然只需要单个应用程序的图像 而不是重叠像素 我知道使用 BitBlt 或的
  • 无法在 WSL2 上运行 OpenGL

    我尝试在 WSL2 上运行 OpenGL 代码 但在尝试运行可执行文件时出现以下错误 GLFW error 65543 GLX Failed to create context GLXBadFBConfig Unable to create
  • 在 GLUT 中使用鼠标滚轮

    我想在 OpenGL GLUT 程序中使用鼠标滚轮来放大和缩小场景 我怎么做 Freeglut 的 glutMouseWheelFunc 回调与版本相关 并且在 X 中不可靠 使用标准鼠标功能并测试按钮 3 和 4 OpenGlut 对 g
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis

随机推荐