opengl 如何更改glDrawElements的缓冲区

q35jwt9p  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(214)

我正在使用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
};

目前我只能画出第一个矩形,我怎么能画出第二个矩形呢?

7rfyedvj

7rfyedvj1#

这与缓冲区无关。你所遇到的是背面剔除,如果你使用glDisable(GL_CULL_FACE)禁用它,你可以只使用一个绘制调用。
另一种方法是把你的几何体做成两个矩形,然后翻转它的缠绕,这样你就可以重复使用顶点位置,只需要复制和翻转索引:

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

相关问题