顶点数组对象在opengl4.1中没有正确绑定



我正在将一些绘图代码从OpenGLES 2.0移植到OpenGL 4.0的过程中,并且我正在运行问题,使我的顶点数组对象绑定。当我运行glValidateProgram我得到这个错误:Validation Failed: No vertex array object bound

下面是我用来绘图的代码:

void RendererRender(RendererRef* renderer) {
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glUseProgram(program);
    glViewport(0, 0, renderer->viewportWidth, renderer->viewportHeight);
    glClearColor(0.2, 0.3, 0.4, 0);
    glClear(GL_COLOR_BUFFER_BIT);
    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(M_PI/4.0, 1.0f, 0.1f, 10000.0f);
    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeLookAt(0,0,-10,
                                            0,0,0,
                                            0,1,0);
    glUniformMatrix4fv(modelViewMatrixUniformLocation, 1, GL_FALSE, modelViewMatrix.m);
    glUniformMatrix4fv(projectionMatrixUniformLocation, 1, GL_FALSE, projectionMatrix.m);
    glGetError();
    glBindVertexArray(triangleVAOId);
    if(!validateProgram(program)){
        NSLog(@"Error validating program");
        glGetError();
    }
    glPointSize(10.0f);
    glDrawElements(GL_POINTS, 3, GL_UNSIGNED_SHORT, NULL);
}

所以看起来好像VAO应该在这一点上被绑定。使用以下代码生成VAO:

typedef struct {
    GLfloat position[3];
} Vertex;

GLuint buildVAO(int vertexCount, Vertex* vertexData, GLushort* indexData, BOOL hasTexture)
{
    GLuint vaoId;
    GLuint indexId;
    //generate the VAO & bind
    glGenVertexArrays(1, &vaoId);
    glBindVertexArray(vaoId);
    GLuint positionBufferId;
    //generate the VBO & bind
    glGenBuffers(1, &positionBufferId);
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferId);
    //populate the buffer data
    glBufferData(GL_ARRAY_BUFFER,
                 vertexCount*sizeof(Vertex),
                 vertexData,
                 GL_DYNAMIC_DRAW);
    //setup the attribute pointer to reference the vertex position attribute
    glEnableVertexAttribArray(kVertexPositionAttributeLocation);
    glVertexAttribPointer(kVertexPositionAttributeLocation,
                          kVertexSize,
                          kPositionVertexTypeEnum,
                          GL_FALSE,
                          sizeof(Vertex),
                          (void*)offsetof(Vertex, position));
    }
    //create & bind index information
    glGenBuffers(1, &indexId);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexId);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertexCount*sizeof(GLushort), indexData, GL_DYNAMIC_DRAW);
    //restore default state
    glBindVertexArray(0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    return vaoId;
}

我注意到的另一件事是,我从glGenVertexArrays得到的VAO id是一个大值,如1606408096,在我工作的例子中,它总是像1或2。

这些都发生在主线程上。

你知道哪里出错了吗?

弄清楚了-原来是因为我使用了错误的glGenVertexArray版本。

我之前有过这样的声明:

#define glGenVertexArrays glGenVertexArraysAPPLE

事实证明,这只需要在3.0之前的OpenGL版本上。

相关内容

  • 没有找到相关文章