如何更改 glDrawElements 的缓冲区

How to change buffers for glDrawElements

我正在使用 glDrawElements 绘制矩形。

glBindVertexArray(m_VAO);
glDrawElements(GL_TRIANGLES, 6 , GL_UNSIGNED_INT, 0);
glBindVertexArray(0);

我想画两个不同的几何图形,一个面向相机,一个在背面。

这是绘图的数据。

verticesRect = {
        // Positions                                      // Normal Coords          // Texture Coords
        (width / 2.0f) + taper,  height / 2.0f, 0.0f,    0.0 , 0.0, 1.0 ,     1.0f, 0.0f,   // Top Right
        width / 2.0f, -height / 2.0f, 0.0f,              0.0 , 0.0, 1.0 ,     1.0f, 1.0f,   // Bottom Right
       -width / 2.0f, -height / 2.0f, 0.0f,              0.0 , 0.0, 1.0 ,     0.0f, 1.0f,   // Bottom Left
       (-width / 2.0f) - taper, height / 2.0f, 0.0f,     0.0 , 0.0, 1.0 ,     0.0f, 0.0f    // Top Left 
    };


     std::vector<float> verticesRectBack = {
         // Positions                                    // Normal Coords          // Texture Coords
        (width / 2.0f) + taper,  height / 2.0f, 0.0f,    0.0 , 0.0, -1.0 ,     1.0f, 0.0f,   // Top Right
        width / 2.0f, -height / 2.0f, 0.0f,              0.0 , 0.0, -1.0 ,     1.0f, 1.0f,   // Bottom Right
       -width / 2.0f, -height / 2.0f, 0.0f,              0.0 , 0.0, -1.0 ,     0.0f, 1.0f,   // Bottom Left
       (-width / 2.0f) - taper, height / 2.0f, 0.0f,     0.0 , 0.0, -1.0 ,     0.0f, 0.0f    // Top Left 
     };

     verticesRect.insert(verticesRect.end(), verticesRectBack.begin(), verticesRectBack.end());   // Combining both the data sets.

这是数据的VAO、VBO配置。

glGenVertexArrays(1, &m_VAO);
    glGenBuffers(1, &m_VBO);
    glGenBuffers(1 , &m_EBO);
    glBindVertexArray(m_VAO);
    glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
    glBufferData(GL_ARRAY_BUFFER,verticesRect.size() * sizeof(float), &verticesRect[0], GL_STATIC_DRAW);    
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indicesTaperRectangle), indicesTaperRectangle, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(2);
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

这是指数的数据。

GLuint indicesTaperRectangle[] = {  // Note that we start from 0!
    0, 1, 3, // First Triangle
    1, 2, 3  // Second Triangle
};

目前我只能画第一个矩形我怎么画第二个矩形。

这与缓冲区无关。您遇到的是背面剔除,如果您使用 glDisable(GL_CULL_FACE).

禁用它,则只需一次绘制调用即可完成

另一种选择是让你的几何体变成两个矩形,然后翻转它的绕组。为此,您可以重复使用顶点位置并复制和翻转索引:

GLuint indicesTaperRectangle_FrontAndBack[] = {
    0, 1, 3,
    1, 2, 3,
    3, 2, 1,
    3, 1, 0 
};