OpenGL GLKit:一起渲染不同大小的顶点对象。ios opengl绘图调用超出了数组缓冲区界限

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

我非常怀疑有人能在这方面帮助我,但是嘿嘿

我有一个3D框架,我一直在工作,世界上大多数东西都是立方体(36个顶点)

我遵循了这篇关于将blender对象引入OpenGL的精彩教程:

我把立方体放进去,一切都很好,然后我试着把一个球体,立方体,圆柱体等等放进去,结果它爆炸了 ios opengl绘图调用超出了数组缓冲区界限

我知道这些对象很好,因为它们与演示应用程序一起工作,但只渲染1个对象,没有数组和顶点等的绑定

反正

我确信这段代码是垃圾代码,但我已经尝试了所有的方法

- (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!,非常感谢你的帮助。老实说,你太棒了!