OpenGL GLKit:一起渲染不同大小的顶点对象。ios opengl绘图调用超出了数组缓冲区界限
我非常怀疑有人能在这方面帮助我,但是嘿嘿 我有一个3D框架,我一直在工作,世界上大多数东西都是立方体(36个顶点) 我遵循了这篇关于将blender对象引入OpenGL的精彩教程: 我把立方体放进去,一切都很好,然后我试着把一个球体,立方体,圆柱体等等放进去,结果它爆炸了 ios opengl绘图调用超出了数组缓冲区界限 我知道这些对象很好,因为它们与演示应用程序一起工作,但只渲染1个对象,没有数组和顶点等的绑定 反正 我确信这段代码是垃圾代码,但我已经尝试了所有的方法OpenGL GLKit:一起渲染不同大小的顶点对象。ios opengl绘图调用超出了数组缓冲区界限,ios,opengl-es-2.0,glkit,Ios,Opengl Es 2.0,Glkit,我非常怀疑有人能在这方面帮助我,但是嘿嘿 我有一个3D框架,我一直在工作,世界上大多数东西都是立方体(36个顶点) 我遵循了这篇关于将blender对象引入OpenGL的精彩教程: 我把立方体放进去,一切都很好,然后我试着把一个球体,立方体,圆柱体等等放进去,结果它爆炸了 ios opengl绘图调用超出了数组缓冲区界限 我知道这些对象很好,因为它们与演示应用程序一起工作,但只渲染1个对象,没有数组和顶点等的绑定 反正 我确信这段代码是垃圾代码,但我已经尝试了所有的方法 - (void)setu
- (void)setupSphere;
{
glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);
//////
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(&sphereVertices), &sphereVertices, GL_STATIC_DRAW);
////
glGenBuffers(1, &_position);
glBindBuffer(GL_ARRAY_BUFFER, _position);
glBufferData(GL_ARRAY_BUFFER, sizeof(spherePositions),spherePositions, GL_STATIC_DRAW);
////
glGenBuffers(1, &_texture);
glBindBuffer(GL_ARRAY_BUFFER, _texture);
glBufferData(GL_ARRAY_BUFFER, sizeof(sphereTexels),sphereTexels, GL_STATIC_DRAW);
////
glGenBuffers(1, &_normal);
glBindBuffer(GL_ARRAY_BUFFER, _normal);
glBufferData(GL_ARRAY_BUFFER, sizeof(sphereNormals),sphereNormals, GL_STATIC_DRAW);
//////
// glBindVertexArrayOES(0);
// Positions
//glBindBuffer(GL_ARRAY_BUFFER, _position);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, spherePositions);
// Texels
//glBindBuffer(GL_ARRAY_BUFFER, _texture);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, sphereTexels);
// Normals
//glBindBuffer(GL_ARRAY_BUFFER, _normal);
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 0, sphereNormals);
//glBindVertexArrayOES(_vertexArray);
glBindVertexArrayOES(0);
}
- (void)drawSphere:(float)eyeOffset
{
// Calculate the per-eye model view matrix:
GLKMatrix4 temp = GLKMatrix4MakeTranslation(eyeOffset, 0.0f, 0.0f);
GLKMatrix4 eyeBaseModelViewMatrix = GLKMatrix4Multiply(temp, self.baseModelViewMatrix);
if (self.isTransparant)
{
glEnable (GL_BLEND);
glDisable(GL_CULL_FACE);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
if (self.textureInfo)
{
glBindTexture(self.textureInfo.target, self.textureInfo.name);
}
glBindVertexArrayOES(_vertexArray);
glUseProgram(_program);
self.modelViewMatrix = GLKMatrix4MakeTranslation(self.position.x,self.position.y, self.position.z );//(float)x, (float)y, -1.5f)
self.modelViewMatrix = GLKMatrix4Scale(self.modelViewMatrix, self.scale.x, self.scale.y, self.scale.z);
//rotation +=0.01;
self.modelViewMatrix = GLKMatrix4Rotate(self.modelViewMatrix,rotation, 0.0 ,0.0 ,1.0);
self.modelViewMatrix = GLKMatrix4Multiply(eyeBaseModelViewMatrix, self.modelViewMatrix);
GLKMatrix3 normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(self.modelViewMatrix), NULL);
GLKMatrix4 modelViewProjectionMatrix = GLKMatrix4Multiply(self.projectionMatrix, self.modelViewMatrix);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, normalMatrix.m);
_colorSlot = glGetUniformLocation(_program, "color");
GLfloat color[] = {
self.color.x, self.color.y, self.color.z, self.color.a};
glUniform4fv(_colorSlot, 1, color);
glDrawArrays(GL_TRIANGLES, 0, sphereVertices);
if (self.isTransparant)
{
glEnable(GL_CULL_FACE);
//glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
}
}
您正在尝试对客户端顶点数组使用VAO。这是不受支持的。引述:
- 是否允许顶点数组对象封装客户端 顶点数组 解决方案:否。OpenGL ES工作组同意兼容性 具有OpenGL和引导开发人员了解更多 通过强制使用VBO来执行绘图比 影响VAOs采用的可能性
如果您想使用VAO,您需要启用VBO代码,该代码似乎主要出现在您的代码中,但目前已被注释掉。如果您知道如何在实际代码中修复此问题,您会让我非常高兴,我应该在注释和注释中添加哪些行。我是在第二组
glBindBuffer
调用的3 amUncomment处进行这项工作的。对于其后的glvertexattributepointer
调用,请将最后一个参数更改为0
,因为一旦您绑定了VBO,这将成为缓冲区的偏移量。先生,rock!,非常感谢你的帮助。老实说,你太棒了!