OpenGLES2 iOS顶点数组对象在drawElements上导致错误的访问错误

OpenGLES2 iOS顶点数组对象在drawElements上导致错误的访问错误,第1张

概述今天下午,当我从使用VBO转到VAO / VBO时,我一直在抨击我的openGLES2.0代码.基本上我正在通过Apple对openGLES的“专家”建议工作,并且转向使用Vertex Array Objects是最重要的… 我已经回顾了类似的问题和回复here,但这似乎没有帮助我,除了再次向我保证其他人遇到类似的问题:( 我的情况是我有大约500个矩形纹理在屏幕上移动.代码一切正常,没有VAO, 今天下午,当我从使用VBO转到VAO / VBO时,我一直在抨击我的openGLES2.0代码.基本上我正在通过Apple对openGLES的“专家”建议工作,并且转向使用Vertex Array Objects是最重要的…

我已经回顾了类似的问题和回复here,但这似乎没有帮助我,除了再次向我保证其他人遇到类似的问题:(

我的情况是我有大约500个矩形纹理在屏幕上移动.代码一切正常,没有VAO,但是当我定义USE_VAO(我的常量)时,它会在第一个绘图元素调用时崩溃.我显然不能正确理解VAO ……但我看不出我的方式错误

在进入渲染循环之前,setupBeforeRender方法被调用为我的设置的最后一部分.

-(voID) setupBeforeRender {glClearcolor(0.6,0.6,1);glVIEwport(0,self.frame.size.wIDth,self.frame.size.height);glEnable(GL_DEPTH_TEST);gluniform1i(_textureUniform,0);glActiveTexture(GL_TEXTURE0); glEnabLevertexAttribarray(_positionSlot);glEnabLevertexAttribarray(_colorSlot);glEnabLevertexAttribarray(_texCoordSlot);glGenBuffers(1,&_indexBuffer);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,_indexBuffer);glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(Indices),Indices,GL_STATIC_DRAW);}

这是渲染方法

- (voID)render:(CAdisplaylink*)displaylink {glClear(GL_color_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Model vIEw matrix and projection code removed for clarityGLsizei strIDe = sizeof(Vertex);const GLvoID* colourOffset = (GLvoID *) sizeof(float[3]);const GLvoID* textureOffset = (GLvoID *) sizeof(float[7]); for (my objectToDraw in objectToDrawArray) {    if (objectToDraw.vertexBufferObject == 0)    {        #ifdef USE_VAO        glGenVertexArraysOES(1,&_vao);        glBindVertexArrayOES(_vao);        glVertexAttribPointer(_positionSlot,3,GL_float,GL_FALSE,strIDe,0);        glVertexAttribPointer(_colorSlot,4,colourOffset);        glVertexAttribPointer(_texCoordSlot,2,textureOffset);            objectToDraw.vertexBufferObject = [objectToDraw createAndBindVBO];        objectToDraw.vertexArrayObject = _vao;        glBindBuffer(GL_ARRAY_BUFFER,0);        glBindVertexArrayOES(0);        #else        objectToDraw.vertexBufferObject = [objectToDraw createAndBindVBO];        #endif    }   // Texture binding removed for clarity         #ifdef USE_VAO    // This code crashes with EXC_BAD_ACCESS on the glDrawElements      glBindVertexArrayOES(objectToDraw.vertexArrayObject);    glDrawElements(GL_TRIANGLES,sizeof(Indices) / sizeof(Indices[0]),GL_UNSIGNED_SHORT,0);    glBindVertexArrayOES(0);                    #else            // This path works fine. So turning VAO off works :(    glBindBuffer(GL_ARRAY_BUFFER,storyTile.vertexBufferObject);    glVertexAttribPointer(_positionSlot,0);    glVertexAttribPointer(_colorSlot,colourOffset);    glVertexAttribPointer(_texCoordSlot,textureOffset);    glDrawElements(GL_TRIANGLES,0);    #endif} // End for each object[_context presentRenderbuffer:GL_RENDERBUFFER];}

最后,我的create和bind VBO方法看起来像这样;

-(gluint) createAndBindVBO {const float* rgba = CGcolorGetComponents([self.colour CGcolor]);Vertex Vertices[] = {    {{0,1,0},{1,1},{0,1}},{{0,0}},{{1,0}}};// Code removed for clarity - sets up geometry and colours    gluint vertexBuffer;glGenBuffers(1,&vertexBuffer);glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer);glBufferData(GL_ARRAY_BUFFER,sizeof(Vertices),Vertices,GL_STATIC_DRAW);return vertexBuffer;}

我已经尝试了各种各样的排列,并将代码与glGetError()一起使用,以查看是否有助于指出问题出现的位置.唉,除了drawElements调用上的BAD_ACCESS崩溃之外,我没有得到任何错误.

编辑:正如所建议的,这不幸也行不通

objectToDraw.vertexBufferObject = [objectToDraw createVBO];glGenVertexArraysOES(1,&_vao);glBindVertexArrayOES(_vao);glBindBuffer(GL_ARRAY_BUFFER,objectToDraw.vertexBufferObject);glVertexAttribPointer(_positionSlot,0);glVertexAttribPointer(_colorSlot,colourOffset);glVertexAttribPointer(_texCoordSlot,textureOffset);    objectToDraw.vertexArrayObject = _vao;glBindVertexArrayOES(0);

我必须对顶点数组对象做一些愚蠢的事情……但有人能弄明白问题是什么吗?

解决方法 启用顶点数组的标志是VAO状态的一部分,因此您需要在绑定VAO时使用glEnabLevertexAttribarray启用顶点属性数组.

来自:http://www.khronos.org/registry/gles/extensions/OES/OES_vertex_array_object.txt

The resulting
vertex array object is a new state vector,comprising all the state values (Listed in table 6.2,except ARRAY_BUFFER_BINDING):

VERTEX_ATTRIB_ARRAY_ENABLED VERTEX_ATTRIB_ARRAY_SIZE, VERTEX_ATTRIB_ARRAY_STRIDE, VERTEX_ATTRIB_ARRAY_TYPE, VERTEX_ATTRIB_ARRAY_norMAliZED, VERTEX_ATTRIB_ARRAY_POINTER, ELEMENT_ARRAY_BUFFER_BINDING, VERTEX_ATTRIB_ARRAY_BUFFER_BINDING.
总结

以上是内存溢出为你收集整理的OpenGLES2 iOS顶点数组对象在drawElements上导致错误的访问错误全部内容,希望文章能够帮你解决OpenGLES2 iOS顶点数组对象在drawElements上导致错误的访问错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1052021.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存