glDrawElements提供带有VBO的EXC_BAD_ACCESS [英] glDrawElements gives EXC_BAD_ACCESS with VBO

查看:93
本文介绍了glDrawElements提供带有VBO的EXC_BAD_ACCESS的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚开始学习opengl,并且正在尝试实现VBO.

I've just started learning opengl and I was trying to implement VBOs.

这就是我在做什么:

,对于每个网格,我都会初始化其VBO. mesh-> pos和mesh-> norm包含网格的三角形和四边形的点和法线. mesh-> triangle和mesh-> quad包含索引.

in the main method before I iterate, for each mesh I initialize its VBOs. The mesh->pos and mesh->norm contain the points and the normals of the triangles and the quads of the mesh. The mesh->triangle and mesh->quad contain the indices.

for (auto mesh : scene->meshes)
{
    mesh->vboPos = 0;
    glGenBuffers (1, &mesh->vboPos);
    glBindBuffer (GL_ARRAY_BUFFER, mesh->vboPos);
    glBufferData (GL_ARRAY_BUFFER, 3 * mesh->pos.size() * sizeof(GL_FLOAT), mesh->pos.data(), GL_STATIC_DRAW);

    mesh->vboNorm = 0;
    glGenBuffers (1, &mesh->vboNorm);
    glBindBuffer (GL_ARRAY_BUFFER, mesh->vboNorm);
    glBufferData (GL_ARRAY_BUFFER, 3 * mesh->norm.size() * sizeof(GL_FLOAT), mesh->norm.data(), GL_STATIC_DRAW);

    mesh->vbiTriangle = 0;
    glGenBuffers (1, &mesh-> vbiTriangle);
    glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, mesh-> vbiTriangle);
    glBufferData (GL_ELEMENT_ARRAY_BUFFER, 3 * mesh->triangle.size() * sizeof(GL_UNSIGNED_INT), mesh->triangle.data(), GL_STATIC_DRAW);

    mesh->vbiQuad = 0;
    glGenBuffers (1, &mesh->vbiQuad);
    glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, mesh->vbiQuad);
    glBufferData (GL_ELEMENT_ARRAY_BUFFER, 4 * mesh->quad.size() * sizeof(GL_UNSIGNED_INT), mesh->quad.data(), GL_STATIC_DRAW);
}

while(not glfwWindowShouldClose(window))
{
    ...
}

在此之后,我在shade方法中为我拥有的每个网格调用了绘制.这是网状代码的样子:

After this inside the shade method I call the draw for each mesh I have. This is how the mesh code looks like:

struct Mesh {
frame3f         frame = identity_frame3f;   // frame
vector<vec3f>   pos;                        // vertex position
vector<vec3f>   norm;                       // vertex normal
vector<vec3i>   triangle;                   // triangle
vector<vec4i>   quad;                       // quad
Material*       mat = new Material();       // material

GLuint vboPos = 0;
GLuint vboNorm = 0;
GLuint vbiTriangle =0;
GLuint vbiQuad =0;

int count = 0;

void draw()
{
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, vboPos);
    glBindBuffer(GL_ARRAY_BUFFER, vboNorm);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbiTriangle);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbiQuad);
    glEnableClientState(GL_VERTEX_ARRAY);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawElements(GL_TRIANGLES, triangle.size() * 3, GL_UNSIGNED_INT, 0);
    glDrawElements(GL_QUADS, quad.size() * 4, GL_UNSIGNED_INT, 0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
}

我真的不知道造成此问题的原因是什么,但是我敢肯定我对VBO的工作方式并不了解.你能启发我吗?

I don't really know what's the problem causing this, but I'm pretty sure I didn't understand something of how VBOs work. Can you enlighten me?

推荐答案

您在这里尝试一次做太多事情,我感觉驱动程序正在超速运行一个数组,试图读取错误的元素数组.

You are trying to do too many things at once here and I have a feeling the driver is overrunning an array trying to read the wrong element array.

void draw()
{
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    /* Setup your Position array */
    glBindBuffer(GL_ARRAY_BUFFER, vboPos);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    /* Then setup your Normal array */
    glBindBuffer(GL_ARRAY_BUFFER, vboNorm);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);


    /* DO NOT DO THIS -- you are using generic vertex attributes. */
    //glEnableClientState(GL_VERTEX_ARRAY);


    /* First the Triangles */
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbiTriangle);
    glDrawElements(GL_TRIANGLES, triangle.size() * 3, GL_UNSIGNED_INT, 0);

    /* Now the Quads */
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbiQuad);
    glDrawElements(GL_QUADS, quad.size() * 4, GL_UNSIGNED_INT, 0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
}

这篇关于glDrawElements提供带有VBO的EXC_BAD_ACCESS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆