如何更改 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
};
我正在使用 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
};