绘制顶点缓冲区对象时出错

时间:2014-11-10 23:26:13

标签: android android-ndk opengl-es-2.0

我有一个Android应用程序,可以渲染一些从OBJ文件加载的3D模型。起初我尝试只渲染顶点(没有法线和纹理坐标信息)。

将OBJ文件顶点加载到三角形矢量后,我尝试创建VBO:

struct obj_model_t {
    GLuint vertex_buf;
    GLuint tex_coord_buf;
    GLuint normals_buf;
    unsigned int count;
};

...
obj_model_t out_model;
// loading triangles to std::vector<glm::vec3> out_vertices;
glGenBuffers(1, &out_model.vertex_buf);
glBindBuffer(GL_ARRAY_BUFFER, out_model.vertex_buf);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * out_vertices.size(), &out_vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

然后,在渲染函数中,我尝试绑定此VBO并从中绘制三角形:

void engine_t::render(double elapsedTime) {
    // clear buffer and other preparations for render

    mat4 mvp = camera_.projection_matrix() * camera_.view_matrix();
    glUseProgram(gProgram);
    checkGlError("glUseProgram");
    glUniformMatrix4fv(g_uMVPMatrix_Handle, 1, GL_FALSE, &mvp[0][0]);

    glBindBuffer(GL_ARRAY_BUFFER, model_.vertex_buf);
    checkGlError("glBindBuffer");
    glEnableVertexAttribArray(g_vPosition_Handle);
    checkGlError("glEnableVertexAttribArray");
    glVertexAttribPointer(g_vPosition_Handle, 3, GL_FLOAT, GL_FALSE, 0, (void *)0);
    checkGlError("glVertexAttribPointer");

    glDrawArrays(GL_TRIANGLES, 0, model_.count); // E/Adreno200-ES20(27772): gl_draw_error_checks:418>: GL_INVALID_OPERATION
    checkGlError("glDrawArrays"); // after glDrawArrays glError (0x502)

    glDisableVertexAttribArray(g_vPosition_Handle);
    checkGlError("glDisableVertexAttribArray");
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

但是如果我将out_vertices从加载函数替换为全局空间并使用:

 glVertexAttribPointer(g_vPosition_Handle, 3, GL_FLOAT, GL_FALSE, 0, (void *)&out_vertices[0]);

没有绑定model_.vertex_buf(没有调用glBindBuffer(GL_ARRAY_BUFFER, model_.vertex_buf);)我的模型正常呈现。

如何解决此问题并使用VBO绘制顶点?

0 个答案:

没有答案