如何解决交错的VBO导致glDrawArrays错误
| 我最近将应用程序从使用OpenGL ES 1.1更改为2.0,在此过程中,我决定通过使用VBO进一步优化代码。我认为我必须处理ES 2.0的主要区别,并得到的结果表明我在没有VBO的情况下可以正确执行工作,但是我为自己遇到的问题感到困惑,这种问题仅在我尝试时才会出现使用VBO。 我使用了一个自定义结构,其中包含顶点的位置,颜色和大小(加上一些填充以对齐数据),然后将该顶点数据插入VBO中。此数据用于渲染点精灵。问题是我在glDrawArrays()调用上得到了EXC_BAD_ACCESS。此错误的回溯如下:#0 0x31fc7358 in gleRunVertexSubmitARM ()
#1 0x31fc87b2 in gleLLVMArrayFunc ()
#2 0x31fc872a in gleSetVertexArrayFunc ()
#3 0x31fbefcc in gleDrawArraysOrElements_ExecCore ()
#4 0x31fc4608 in glDrawArrays_IMM_Exec ()
#5 0x36ddaee2 in glDrawArrays ()
#6 0x0001cab8 in -[Renderer renderDrawingVertexBuffer:withSize:usingTexture:] (self=0x1783b0,_cmd=0x50fec,vboID=0,size=3584,drawTexture=5) at /Users/Stu/Documents/...
#7 0x000202f4 in -[EAGLView drawSmoothCurveFromPoints:endOfLine:] (self=0x195be0,_cmd=0x50d34,points=0x1956f0,endOfLine=1 \'\\001\') at /Users/Stu/Documents/...
#8 0x0001e50c in -[EAGLView drawView:] (self=0x195be0,_cmd=0x50d8a,sender=0x0) at /Users/Stu/Documents/...
#9 0x0001e174 in -[EAGLView layoutSubviews] (self=0x195be0,_cmd=0x3297d4ac) at /Users/Stu/Documents/...
#10 0x326805fa in -[UIView(CALayerDelegate) layoutSublayersOfLayer:] ()
#11 0x35efbf02 in -[NSObject(NSObject) performSelector:withObject:] ()
#12 0x333fbbb4 in -[CALayer layoutSublayers] ()
#13 0x333fb96c in CALayerLayoutIfNeeded ()
这是用于存储顶点数据的结构:
typedef struct {
Isvertex2D vertex; // Made up of 2 GLfloats.
ISColor color; // Made up of 4 GLfloats.
GLfloat size;
GLfloat padding;
} ISPointSpriteData;
在将一组数据存储在这些结构的数组中之后,将数据发送到VBO并使用glDrawArrays()进行渲染:
[renderer prepareScene];
[renderer renderBackground];
glBindBuffer(GL_ARRAY_BUFFER,penVbo);
glBufferSubData(GL_ARRAY_BUFFER,sizeof(ISPointSpriteData) * penVboSize,sizeof(ISPointSpriteData) * vertexCount,&vertexBuffer[0].vertex);
glBindTexture(GL_TEXTURE_2D,drawTexture);
glEnabLevertexAttribArray(ATTRIB_VERTEX);
glEnabLevertexAttribArray(ATTRIB_COLOR);
glEnabLevertexAttribArray(ATTRIB_SIZE);
gldisabLevertexAttribArray(ATTRIB_TEXTURE_COORD);
gluniform1i(uniforms[UNIFORM_IS_SPRITE],GL_TRUE);
glVertexAttribPointer(ATTRIB_VERTEX,2,GL_FLOAT,GL_FALSE,sizeof(ISPointSpriteData),(void*)offsetof(ISPointSpriteData,vertex));
glVertexAttribPointer(ATTRIB_COLOR,4,color));
glVertexAttribPointer(ATTRIB_SIZE,1,size));
glDrawArrays(GL_POINTS,vertexCount); // <--- EXC_BAD_ACCESS
gldisabLevertexAttribArray(ATTRIB_VERTEX);
gldisabLevertexAttribArray(ATTRIB_COLOR);
gldisabLevertexAttribArray(ATTRIB_SIZE);
[renderer presentScene];
这段代码在我将VBO放入之前就可以正常工作,唯一的变化是glVertexAttribPointer()调用的最后一个参数显然指向数据而不是偏移量。我想念什么?我认为这段代码不是特别复杂,所以我只能认为自己在某个地方犯了一个愚蠢的错误。
谢谢
解决方法
问题解决了:
我的代码存在一些问题,并非所有问题都可以从问题清单中看出来。我将概述主要问题:
在未列出的代码中,我正在创建
实用程序功能中的VBO。在
这个功能我不正确
通过
GLuint
手柄
缓冲区(我试图通过它
通过引用的功能
返回void)。为了……的利益
使它更具可读性,我改变了
简单地初始化其功能
拥有并返回它。这个
停止了程序崩溃
glDrawArrays()
行(大概是
未初始化的值必须已经具有
被分配给另一个缓冲区
某处)。
出现了一个新问题-屏幕被拉成黑色,并且两次绘制调用之间存在大的延迟。这是由于...
之后不解除对VBO的绑定
每个抽奖电话。对于每一帧
首先绘制背景纹理,
其次是公益组织的内容。
通过让VBO前往
下一个背景渲染,我是
显然导致OGL有点
合适的!这不仅是原因
黑屏的,但也很大
两次抽奖之间的延迟。
希望这对类似情况的其他人有所帮助!
,您可能必须使用glDrawElements而不是glDrawArrays。因为glDrawArrays不允许跳跃或跳过。它从一组连续的顶点中读取。
\“ glDrawArrays()通过直接在阵列中移动而不跳过或跳跃来读取启用的阵列中的顶点数据。因为glDrawArrays()不允许在顶点阵列中跳跃,因此您仍然必须每个面重复一次共享的顶点。\”
http://www.songho.ca/opengl/gl_vertexarray.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。