什么时候应该调用 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,如何独立旋转对象?

    到目前为止我的代码 void display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Clear Screen And Depth Buffer glLoadIdentity
  • 帧缓冲区/颜色缓冲区?

    有人可以指出我两者是否相同吗 我的意思是我一直在阅读有关它的信息 这里的红皮书说 颜色缓冲区本身可以由多个子缓冲区组成 系统上的帧缓冲区包含所有这些缓冲区 here http glprogramming com red chapter10
  • 为什么 OpenGL 有远裁剪平面,以及使用什么惯用法来处理这个问题?

    我一直在学习 OpenGL 持续困扰我的一个话题是远裁剪平面 虽然我可以理解近剪裁平面和侧剪裁平面 它们永远不会产生任何实际效果 因为它们之外的对象无论如何都不会被渲染 背后的推理 但远剪裁平面似乎只是一个烦恼 由于 OpenGL 背后的人
  • 为什么 glClear 不清除我的屏幕?

    这是我编写的一个简单的 opengl 程序 我试图在绘制三角形之前清除屏幕 我在 init 函数中调用了 glClear 但是 它似乎无法清除屏幕 include
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 使用 glGetFloatv 检索 pyglet 中的模型视图矩阵

    我正在使用 pyglet 在 python 中进行 3D 可视化 并且需要检索模型视图和投影矩阵来进行一些选择 我使用以下方式定义我的窗口 from pyglet gl import from pyglet window import wi
  • OpenGL中背景对象绘制在前景对象前面?

    为了测试目的 我们假设我画了 2 个茶壶glutSolidTeapot 像这样 glColor3f 1 0f 0 0f 0 0f Red teapot glutWireTeapot 1 0f glColor3f 0 0f 1 0f 0 0f
  • 渲染具有透明度的纹理时,OpenGL 不需要的像素

    我已经为这个问题苦苦挣扎了一段时间了 当我使用 OpenGL 渲染 2D 纹理 在无透明度和部分透明度之间的过渡上具有透明度值 时 我得到了一些烦人的灰色像素 我认为这是像素值插值的产物 关于如何改进这一点有什么想法吗 I m attach
  • Opengl 视频纹理

    我正在使用 Visual Studio 10 在 Windows 上用 C 开发 opengl 应用程序 目前我在立方体上使用静态纹理 但我想集成视频纹理 你知道我可以使用哪个库来打开和解密视频吗 查看 ffmpeg libavformat
  • glm 中矩阵值的顺序不正确?

    我开始使用GLM http glm g truc net通过 OpenGL 3 和 GLSL 进行数学运算的库 我需要正交投影来绘制 2D 图形 所以我编写了这个简单的代码 glm mat4 projection 1 0 projectio
  • OpenGL:始终相同的颜色

    我正在 Windows 上编写一个程序 使用c opengl 2 1 and SDL我在顶点颜色方面遇到了一些问题 我在用着glColor3f设置每个顶点集的颜色 但它似乎不起作用 无论我选择什么颜色 我都会将每个顶点绘制为红色 我检查了传
  • GLSL聚光投影体积

    在我的开源项目中 我使用 Qt3D 设置了延迟渲染管道 到目前为止一切顺利 但现在我想通过添加聚光灯投影量来继续前进 例如场景中好像有烟雾 像这样 我正在使用的片段着色器位于问题的末尾 我读过 对于每个片段 我应该从光位置进行光线行进并找到
  • 在 OpenGL 中实例化数百万个对象:提高每秒帧数

    我的最终目标是以 60 fps 渲染 100 万个不同尺寸和颜色的球体 我也希望能够在屏幕上移动相机 我已经修改了代码我正在学习的教程的这一页 http learnopengl com Advanced OpenGL Instancing尝
  • matplotlib:渲染到缓冲区/访问像素数据

    我想使用 matplotlib 生成的图作为 OpenGL 中的纹理 到目前为止 我遇到的 matplotlib 的 OpenGL 后端要么不成熟 要么已经停止使用 所以我想避免使用它们 我当前的方法是将图形保存到临时 png 文件中 并从
  • 如何在多采样纹理上渲染帧缓冲区对象?

    我目前有一个使用多个通道的渲染引擎 其中图像的各个部分在纹理上渲染 然后使用着色器进行组合 它有效 现在我想激活多重采样 我在这里读到 http www opengl org wiki Framebuffer Object Examples
  • OpenSceneGraph 将相机设置在初始位置

    我是第一次使用 OpenSceneGraph 我有点迷失 因为文档确实不太清楚 所以 我有这段代码加载一个带有房子的 obj 文件 并且我在我想要的 人 所在的地方淹没了一个小盒子 所以现在 我不想把那个盒子放在那里 而是想把相机放在那里
  • 之前对 GL.Color3 的调用使我的纹理使用了错误的颜色

    制作 2D OpenGL 游戏 渲染帧时 我需要首先绘制一些计算的四边形几何体 然后绘制一些纹理精灵 当我的渲染方法主体仅绘制精灵时 一切正常 但是 当我尝试在精灵之前绘制几何四边形时 精灵的纹理会更改为之前使用的最后一个 GL Color
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • 如何在 R 中导入并绘制三角形网格?

    我想在 R 中绘制我的模型输出 它是格式为的三角形网格 x1 y1 z1 x2 y2 z2 x3 y3 z3 value 每行代表一个三角形 我想用以下方法绘制这些三角形value作为规模 mymesh lt structure c 0 9
  • 新显卡上的 nvoglv32.dll 中的绘制调用崩溃

    几天前 由于一些硬件更改 我设置了计算机并安装了新的 Windows 8 副本 其中 我将显卡从 Radeon HD 7870 更改为 Nvidia GTX 660 再次设置 Visual Studio 11 后 我从 Github 下载了

随机推荐