OpenGL错误总结

2023-10-29

const char* getGLErrorInfo(int errorId)
{
	switch (errorId)
	{
	case GL_INVALID_ENUM:
		return ("GL Invalid Enum\n");
	case GL_INVALID_VALUE:
		return ("GL Invalid Value\n");
	case GL_INVALID_OPERATION:
		return ("GL Invalid Operation\n");
	case GL_OUT_OF_MEMORY:
		return ("GL Out Of Memory\n");
	//case GL_INVALID_FRAMEBUFFER_OPERATION:
	//	return ("GL Invalid FrameBuffer Operation\n");
	case  GL_STACK_OVERFLOW:
		return ("GL Stack Overflow\n");
	case GL_STACK_UNDERFLOW:
		return ("GL Stack Underflow\n");
	//case GL_TABLE_TOO_LARGE:
	//	return ("GL Table Too Large\n");
	};

	return "GL Undefined Error";
}

错误示例1:

double viewMatrix[16];

glGetDoublev(GL_MODELVIEW, viewMatrix);  编译不会报错,但是获取的viewMatrix失败。通过glGetError  获得错误码是GL_INVALID_ENUM 0x0500。

正确写法glGetDoublev(GL_MODELVIEW_MATRIX, viewMatrix);

GL_PROJECTION_MATRIX / GL_PROJECTION

获取视口信息直接GL_VIEWPORT 

错误示例2:

画线条(即使只画一根线条)时候应该传GL_LINES, 不小心传了GL_LINE,编译也不会报错,但就是没效果。

画点GL_POINTS,四边形GL_QUADS。不小心写了GL_QUAD 编译报错 使用了未定义的枚举变量。

GL_LINE,GL_POINT,opengl中用来定义多边形的绘制模式,还有GL_FILL模式。

错误示例3:

在BeginDraw函数中call函数glPushAttrib,保存属性,在EndDraw函数中忘记glPopAttrib,检查opengl状态时,输出错误码为0x01,差了opengl手册居然没有这个错误码的说明。。。

错误示例4:

void Display()
{
	// Clear frame buffer
	glClearColor(0, 0, 0, 1);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glEnable(GL_DEPTH_TEST);

	// Set light
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);

	// Rotate and draw shape
	glPushMatrix();

	glTranslatef(0.5f, -0.3f, 0.0f);

	// 根据四元数计算旋转矩阵
	ConvertQuaternionToMatrix(g_Rotation, mat);
	glMultMatrixf(mat);

	// 缩放操作
	glScalef(g_Zoom, g_Zoom, g_Zoom);

	// 调用显示列表绘制物体
	glCallList(g_CurrentShape);
	glPopMatrix();

	// 绘制UI
	TwDraw();

	// Present frame buffer
	glutSwapBuffers();

	// Recall Display at next frame
	glutPostRedisplay();
}

void TwDraw()
{
	// BeginDraw
	glMatrixMode(GL_TEXTURE); glPushMatrix(); glLoadIdentity();
	glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity();
	glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity();

	// Draw UI

	// EndDraw
	glMatrixMode(GL_MODELVIEW); glPopMatrix();
	glMatrixMode(GL_PROJECTION); glPopMatrix();
	glMatrixMode(GL_TEXTURE); glPopMatrix();	// 将矩阵堆栈状态设为GL_TEXTURE
}

上面代码段代码,在BeginDraw操作保存当前的各种矩阵堆栈,EndDraw操作还原之前的矩阵堆栈,都没问题。关键是TwDraw函数放到Display函数中以后,二者结合起来运行一次以后就会有问题。而且问题十分奇怪,无论Display函数中如何glMultMatrix,如何glScale,如何glTranslate ,物体最终的位置都没有变化。

因为什么呢?
答案的根因是因为opengl是一个状态机。。。TwDraw的EndDraw操作将当前操作的矩阵堆栈设为 纹理堆栈,因此Display函数第一次执行,可能继承了来自ReShape函数中的状态,当前矩阵堆栈是模型视图,但是一旦TwDraw函数执行,就会十分“隐晦”地将当前的堆栈状态设为GL_TEXTURE,所以第二次Display函数中的glPushMatrix,glMultMatrix,glScale,glTranslate,glPop都是操作纹理堆栈,对物体的位置一点作用也没有。

参见opengl官网,Avoiding 16 Common OpenGL Pitfalls
的第三点:http://www.opengl.org/archives/resources/features/KilgardTechniques/oglpitfall/

状态紊乱导致的错误示例5:

批量绘制地图上的道路,数据量很大,当批处理阈值小于2500时所有道路可以正常绘制,当批处理阈值大于2500时就会中断。。而且是crash是必现的。不知错在哪里Zz。卡了很几天,google了好久,http://www.gamedev.net/topic/456605-opengl-crashes-in-gldrawelements/  15楼zedz方法给了灵感:glDrawElements之前,禁掉纹理、顶点、颜色数组,绘制完再开启,此时道路没绘制出来也没有crash。说明问题出在顶点数组状态上,经过排查没有关闭GL_TEXTURE_COORD_ARRAY。道路采用颜色数组绘制,glVertexPointer只传了颜色和位置信息,而绘制完地图瓦片后GL_TEXTURE_COORD_ARRAY状态并没有被禁掉。

遇到过最隐晦的错误

重叠区域像素抖动特别厉害:
  
左图红色矩形框,右图更加严重楼块跟地图根本区分不开,视觉效果十分差!
正常的效果应该是:
出问题时透视参数:gluPerspective(45, aspect, 0.001, 10000.0);
楼块,地图本身绘制是没有问题的。问题出在gluPerspective函数设置视棱锥过长,超过了OpenGL深度缓冲区的精度,导致每次片源的深度测试结果不一致(不在支持重入性)。一般深度缓冲区是16byte buffer。精度是0-65536。
错误示例5:
网友的疑问,模型缩小时会有黑块闪烁问题,
放大后则没有问题
他的视棱锥设置:
0.1到30000,范围为300000,一般深度缓冲区16位精度也就32768。。。

Alpha混合错误:

图1是原始纹理图片,图2是错误的显示结果(设计师不满意要求修改),图3是修改后的效果与原始气泡样式保持一致。


图2采用的混合模式时:glBlend( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  混合公式为 

dst{ RGBA } = src{ RGBA } * srcA + dst{ RGBA } * (1 - srcA)  气泡主体部分也混合了底图背景(灰色调),所以整体结果是灰色调。

图3采用的混合模式时:glBlend( GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 混合公式为

dst{ RGBA } = src{ RGBA } * 1 + dst{ RGBA } * (1 - srcA)  既有抠图效果,又保持气泡色调不变。

同样的BUG再次出现:

 

左下角为原始纹理,黑色部分RGBA全部为0,;左上角混合模式为(srcA, 1-srcA),结果描边处看上去有种脏的感觉;右上角混合模式为(1, 1-srcA) 结果十分干净、明朗!

其他错误:

模型顶点和照相机相对位置不对,导致看不到效果。

开了光照,但是模型顶点没有设置法线 导致绘制失败。

后续继续更新中。。。

修改记录:

2012/7/29 - 增加错误示例3、4。

2013/7/9 -增加深度缓冲区错误。

2013/9/6  - 增加alpha混合错误

2013/11/23 -增加状态紊乱错误示例5


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

OpenGL错误总结 的相关文章

  • 计算数组中接下来的 n 个元素的乘积

    我想计算下一个的乘积n矩阵的相邻元素 号码n要相乘的元素数应在函数的输入中给出 例如 对于此输入 我应该从第一个开始计算每 3 个连续元素的乘积 p ind max product 1 2 2 1 3 1 3 这给出了 1 2 2 2 2
  • 纹理采样:根据LOD值计算BIAS值

    GL ES 2 0 中的功能纹理2DLod在片段着色器中不可用 我需要移植 GLSL 着色器 在 GL ES 2 0 中我只能使用二维纹理 sampler2D 采样器 vec2 坐标 浮点数bias 告诉我如何计算 a 的值bias相当于已
  • 使用 numpy tensordot 进行张量乘法

    我有一个张量 U 由 n 个维度 d k 的矩阵和一个维度 k n 的矩阵 V 组成 我想将它们相乘 以便结果返回一个维度为 d n 的矩阵 其中 j 列是 U 的矩阵 j 与 V 的 j 列之间的矩阵乘法的结果 获得此信息的一种可能方法是
  • MPI - 发送和接收列

    我需要从一个进程发送矩阵列并从另一个进程接收它 我尝试运行以下程序 但得到了一个奇怪的结果 至少我这么认为 仅复制矩阵的第一个元素 某些矩阵元素会发生意外变化 include
  • Python矩阵问题[重复]

    这个问题在这里已经有答案了 这是从这个线程继续的 Python矩阵 有什么解决方案吗 https stackoverflow com questions 5835583 python matrix any solution Input fr
  • 仅在发布模式下使用 glGenBuffer 时出现未处理的异常 - QT

    我在 Windows 7 上使用 Qt 4 8 发布模式编译项目时遇到了一些问题 调试时一切正常 但在发布时我收到未处理的异常 0xC0000005 访问冲突 我将范围缩小到发生这种情况的行 即生成像素缓冲区的时间 我的第一个猜测是 DLL
  • 用 R 代码编写 Householder QR 分解函数

    我正在编写一段代码来查找 R 中矩阵的 QR 分解 X lt structure c 0 8147 0 9058 0 127 0 9134 0 6324 0 0975 0 2785 0 5469 0 9575 0 9649 0 1576 0
  • 有没有比“[”更快的方法来对稀疏矩阵进行子集化?

    我是 seqMeta 包的维护者 正在寻找如何加速将大矩阵多次分割成小块的瓶颈的想法 背景 seqMeta 包用于分析遗传数据 所以你有一组受试者 n subject 和一些遗传标记 n snps 这导致 n subject x n snp
  • R 将向量重塑为多列

    假设我在 R 中有一个向量 如下所示 d lt seq 1 100 我想将这个向量重塑为 10x10 矩阵 这样我就可以得到以下数据 1 2 3 10 1 2 3 10 11 12 13 20 21 22 23 30 91 92 93 10
  • Numpy:查找两个 3-D 数组之间的欧几里德距离

    给定两个维度为 2 2 2 的 3 D 数组 A 0 0 92 92 0 92 0 92 B 0 0 92 0 0 92 92 92 如何有效地找到 A 和 B 中每个向量的欧几里得距离 我尝试过 for 循环 但速度很慢 而且我正在按 g
  • 对矩阵进行舍入,保留行和列总计

    想要 以保留行和列总计的方式对矩阵进行舍入的 伪 代码 问题从向量开始 X and Y of 非负整数 with Sum X Sum Y 想要圆X Y Sum X 同时保留行和列总计 这是婚姻问题的一种 Xa需要进行一定次数的握手 拨打该号
  • 当行大小大于向量宽度时 SIMD 转置

    你可以找到很多good https stackoverflow com a 25625919 149138 answers https stackoverflow com a 29587984 149138用于转置一个矩阵 该矩阵落在nat
  • 如何使用OpenGL数组纹理?

    我正在尝试在OpenGL中使用精灵表 通过数组纹理实现它这就是我加载纹理的方式 QImage image image load C QtProjects project images spritesheet png png const un
  • 是否可以在 Mac OS X 上构建 FreeGLUT?

    我正在做一些关于 OpenGL 的教程 http www arcsynthesis org gltut Basics Tutorial 2001 html那个使用FreeGLUT http freeglut sourceforge net
  • R::bigmemory - 如何创建角色big.matrix?

    我尝试使用bigmemory封装在R我一开始就陷入困境 我愿意 temp lt matrix paste a 1 10 5 2 并得到一个字符矩阵 没关系 但后来我尝试 x lt as big matrix temp type char 我
  • sRGB 纹理。它是否正确?

    我最近阅读了一些有关 sRGB 格式以及它们如何允许硬件自动对典型显示器执行色彩校正的文章 作为我阅读的一部分 我发现您可以使用普通纹理和返回结果上的 pow 函数来模拟此步骤 无论如何 我想问两个问题 因为我以前从未使用过此功能 首先 有
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 线性/非线性纹理映射扭曲的四边形

    In my 上一个问题 https stackoverflow com questions 10832909 quad strip texturing distortion 已经确定 当对四边形进行纹理化时 面被分解为三角形 并且纹理坐标以
  • 并排显示图像的一半 - OpenGL

    我为两个图像创建了两个纹理 现在我想在opengl中按图像2的左侧部分 完整的图像1 图像2的右侧部分的顺序显示该纹理 我已经做了如下 Image1 显示在 opengl 屏幕的中央 但屏幕的左右部分不正确 应分别显示 image2 的左侧
  • 如何在 Moderngl EGL 后端添加深度缓冲区?

    此代码渲染一个带有抗锯齿功能的彩色三角形 samples 8 当深度缓冲线depth attachment ctx depth texture 512 512 samples 8 被评论 但是当我添加深度缓冲区时 它会在绑定处返回 GL 错

随机推荐

  • 10款炫酷的HTML5动画特效,附源码

    HTML5确实非常强大 很多时候我们可以利用HTML5中的新技术实现非常炫酷效果时 这些效果也非常消耗电脑的CPU 但是这些HTML5效果确实能给用户带来不一样的用户体验 今天我要跟大家分享一些HTML5实现的惊艳特效 希望你可以喜欢 1
  • Docker运行容器端口映射

    大致描述 我发现docker启动容器时 以redis为例 在已经启动了一个 p 6379 6379的redis1容器后 当我们开启第二个redis2容器时 右边的端口映射既可以写别的我们想要映射的端口 p 6380 6380 redis2
  • 如何初始化使用中断

    概念 中断向量 中断服务程序的入口地址 首地址 中断向量表 系统中RAM或ROM的一个区域 用于存储各种中断向量的首地址 其大小取决于CPU支持的中断类型和数量 中断优先级 多个中断源同时向CPU申请中断 为了能够有序地处理多个中断申请所以
  • 感悟2022年:玫琳凯公布今年上半年以来的奖项、里程碑和成就

    玫琳凯公司获得30个奖项 其中包括10个雇主奖 凭借卓越的商业表现 社会影响 倡导参与和可持续发展努力而获得认可 玫琳凯公司 Mary Kay Inc 正在感悟2022年的成就 今年上半年 这家标志性的全球创业公司进一步推进皮肤科学创新 继
  • RxODE 包的使用 (CPT tutorial paper part 1)

    本文基于tutorial paper Wang W Hallow KM James DA A Tutorial on RxODE Simulating Differential Equation Pharmacometric Models
  • MIPI-DSI 三种 Video Mode 理解

    D PHY的物理层支持HS High Speed 和LP Low Power 两种工作模式 HS模式 低压查分信号 功耗大 高速率 80M 1Gbps 信号幅值 100mv 300mv LP模式 单端信号 功耗小 速率低 lt 10Mbps
  • QTableWidget详细使用示例(里面有QMenu实现多级菜单的方法)

    目录 一 创建行表头 二 往表格里插入单元项 带图片和不带图片 三 禁止表格可编辑 四 按行或列或单个选择单元项 五 设置列宽 包括列表头的和行表头的 1 这个普通的行和列都可以设置固定宽高 2 还可以将行和列的大小设为与内容相匹配 3 不
  • 《信号与系统》解读 第1章 信号与系统概述-2:时域信号的分类--确定性信号、离散信号、周期信号、线性信号、基本信号与复合信号

    目录 1 确定性信号与随机信号 2 连续信号与离散信号 3 周期信号与非周期信号 4 线性信号与非线性信号 5 基本信号与复合信号 5 1 单位阶跃信号 基本的数字信号 5 2 单位斜变信号 基本的数字积分 5 3 自然指数信号 信号的自然
  • Python 数据分析实战案例:基于电商销售数据的 RFM 模型构建

    目录 1 背景 2 分析目标 3 数据准备 4 数据清洗 4 1 查看是否含有缺失值 4 2 查看是否有异常值 4 3 数据整理 5 具体目标分析 5 1 分析每年销售额的增长率 5 2 各个地区分店的销售额 5 3 销售淡旺季分析 5 4
  • redis过期策略

    我们使用redis的时候一般会设置过期时间 redis设置过期时间 expire 只针对顶级key有效 即哈希结构不支持过期 value为hash结构的时候 不能对hash中的某一部分进行过期设置 expire key time 以秒为单位
  • PCL 环境下安装配置CGAL 5.5

    目录 一 CGAL简介 二 Using CGAL on Windows with Visual C 1 CGAL下载 2 GMP和MPRF安装 3 boost安装与环境变量设置 三 PCL环境下配置CGAL 四 测试代码 五 结果展示 一
  • 【机器学习】贝叶斯分类器(算法原理实现及sklearn实现)

    系列文章目录 第一章 先验概率和后验概率的通俗解释 贝叶斯分类 第二章 贝叶斯公式证明及Bayesain在机器学习重要地位的理解 第三章 机器学习 贝叶斯分类器 文章目录 系列文章目录 前沿 一 贝叶斯决策论 二 极大似然估计 三 朴素贝叶
  • ddt的使用

    ddt一指data driver test 是一种测试思想 意指数据驱动 这里将的ddt是ddt库 配合unittest使用 假设我们有个登录功能需要设计测试用例 用例如下 1 正确的账号密码登录 2 错误的账号密码登录 3 账号为空登录
  • 模拟电路设计(18)---负阻型正弦波振荡器

    负阻型正弦波振荡器 具有负的微变电阻特性的电子器件称为负阻器件 在一个LC或者谐振腔振荡回路中 若以负阻器件与消耗能量的常规电阻相抵消 使得振荡回路无能量消耗 那么电路也能维持正常的振荡 在实际电路中 负阻器件肯定是有源器件 由这种形式构成
  • Swagger 常用注解

    ApiOperation描述接口的详细内容 ApiModel描述实体类的相关信息 Api用在Controller上面说明Controller的信息 ApiModelProperty用在参数上说明参数的详细信息 ApiImplicitPara
  • 美团滑块模拟登录

    本教程仅限于学术探讨 也没有专门针对某个网站而编写 禁止用于非法用途 商业活动 恶意滥用技术等 否则后果自负 观看则同意此约定 如有侵权 请告知删除 谢谢 aHR0cHM6Ly9wYXNzcG9ydC5tZWl0dWFuLmNvbS9hY2
  • Chapter 17. Network Drivers

    17 Network Drivers Linux Device Drivers 3rd Edition Book Chapter 17 Network Drivers Having discussed char and block driv
  • InnoDB行锁等待

    关键词 InnoDB 行锁 行锁等待 行锁等待超时 问题 数据库错误 Lock wait timeout exceeded try restarting transaction 什么是锁等待 Lock Wait 呢 当事务A对数据表进行DD
  • Javaweb实验:静态网页制作

    Javaweb实验 1 静态网页制作 目录 Javaweb实验 前言 一 实验目的 二 实验原理 三 实验内容 四 实验步骤 五 实验结果 六 实验内容 七 实验步骤 八 实验结果 九 思考 1 frameset和frame标签的作用是什么
  • OpenGL错误总结

    const char getGLErrorInfo int errorId switch errorId case GL INVALID ENUM return GL Invalid Enum n case GL INVALID VALUE