我已经回顾了类似的问题和回复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_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.
vertex array object is a new state vector,comprising all the state values (Listed in table 6.2,except ARRAY_BUFFER_BINDING):
以上是内存溢出为你收集整理的OpenGLES2 iOS顶点数组对象在drawElements上导致错误的访问错误全部内容,希望文章能够帮你解决OpenGLES2 iOS顶点数组对象在drawElements上导致错误的访问错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)