【问题标题】:Having issues drawing 3D cube's edges with OpenGL 3使用 OpenGL 3 绘制 3D 立方体的边缘时出现问题
【发布时间】:2021-03-06 12:39:43
【问题描述】:

我正在尝试使用 OpenGL(4.3 核心配置文件)绘制 3D 立方体的顶点(仅边缘),我知道 glPolygonMode 函数,但我不想绘制中间对角线。我像这样声明我的顶点和我的索引:

struct Vertex {
    glm::vec3 pos;
    glm::vec3 color;
    glm::vec3 normal;
    glm::vec2 uv;
};

Vertex vertices[8];

// Front vertices
vertices[0].pos = glm::vec3(-0.5f, -0.5f, +0.5f);
vertices[1].pos = glm::vec3(+0.5f, -0.5f, +0.5f);
vertices[2].pos = glm::vec3(+0.5f, +0.5f, +0.5f);
vertices[3].pos = glm::vec3(-0.5f, +0.5f, +0.5f);

// Back vertices
vertices[4].pos = glm::vec3(-0.5f, -0.5f, -0.5f);
vertices[5].pos = glm::vec3(+0.5f, -0.5f, -0.5f);
vertices[6].pos = glm::vec3(+0.5f, +0.5f, -0.5f);
vertices[7].pos = glm::vec3(-0.5f, +0.5f, -0.5f);

GLuint indices[36] = {
    0, 1, 2, 2, 3, 0, // Front
    1, 5, 6, 6, 2, 1, // Right
    7, 6, 5, 5, 4, 7, // Back
    4, 0, 3, 3, 7, 4, // Left
    4, 5, 1, 1, 0, 4, // Bottom
    3, 2, 6, 6, 7, 3 // Top
};

我的缓冲区已相应更新:

// Bind Vertex Array
glBindVertexArray(_VAO);

// Bind VBO to GL_ARRAY_BUFFER type so that all calls to GL_ARRAY_BUFFER use VBO
glBindBuffer(GL_ARRAY_BUFFER, _VBO);

// Upload vertices to VBO
glBufferData(GL_ARRAY_BUFFER, verticesNb * sizeof(Vertex), vertices, GL_STATIC_DRAW);

// Bind EBO to GL_ARRAY_BUFFER type so that all calls to GL_ARRAY_BUFFER use EBO
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _EBO);

// Updload indices to EBO
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesNb * sizeof(GLuint), indices, GL_STATIC_DRAW);

我正在使用glDrawElements(GL_LINES, 36, GL_UNSIGNED_INT, 0); 绘制立方体的边缘,但由于某种原因它没有绘制一些边缘,我不明白为什么。

如果我使用 GL_TRIANGLES,当我想在填充模式下渲染我的 3D 立方体时,它工作得很好。有谁知道我在这里缺少什么?是指数的问题吗?

(下面的“立方体”自定义大小为(1.0f, 2.0f, 3.0f)

【问题讨论】:

    标签: c++ opengl glm-math indices vertices


    【解决方案1】:

    您的索引形成GL_TRIANGLES 原语而不是GL_LINES 原语。见GL_LINES

    顶点 0 和 1 被视为一条线。顶点 2 和 3 被视为一条线。以此类推。

    索引形成基元。更改索引:

    GLuint indices[] = {
        0, 1, 1, 2, 2, 3, 3, 0, // Front
        4, 5, 5, 6, 6, 7, 7, 4, // Back
        0, 4, 1, 5, 2, 6, 3, 7
    };
    
    glDrawElements(GL_LINES, 24, GL_UNSIGNED_INT, 0);
    

    【讨论】:

    • 或使用GL_LINE_STRIP
    • @wcochran 那么你必须使用一个非常棘手的索引顺序或Primitive Restart
    • 好点...如果您要对立方体着色,那么您将要表示每个顶点 3 次(每个相邻面一次),因为将有 3 个不同的法线。所以可能还是想重做一些事情......
    • @MajorSquirrel 当然可以有相同的顶点。然而,索引形成了原语。不同的原语需要不同的索引。您不需要 2 个不同的顶点缓冲区,但需要 2 个不同的索引缓冲区。您可以创建 2 个 VAO,它们使用相同的顶点规范和相同的顶点缓冲区,但使用不同的索引缓冲区 (GL_ELEMENT_ARRAY_BUFFER)。
    • @Rabbid76 “indices form the primitive”这句话让我更清楚,因为我可以有特定的顶点,但最后,索引定义了要绘制的原语,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2017-11-13
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多