簡體   English   中英

glDrawElements提供VBO EXC_BAD_ACCESS

[英]glDrawElements gives EXC_BAD_ACCESS with VBO

我剛剛開始學習opengl,並且正在嘗試實現VBO。

這就是我在做什么:

在迭代之前,在main方法中,對於每個網格,我都會初始化其VBO。 mesh-> pos和mesh-> norm包含網格的三角形和四邊形的點和法線。 mesh-> triangle和mesh-> quad包含索引。

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方法中,我為每個具有的網格調用繪制。 這是網格代碼的樣子:

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的工作方式並不了解。 你能啟發我嗎?

您在這里嘗試一次做太多事情,我有一種感覺,驅動程序正在超載一個數組,試圖讀取錯誤的元素數組。

您的繪圖功能需要重新編寫:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM