首先,我使用OpenGL渲染点云。
// The object pointCloud wraps some raw data in different buffers.
// At this point, everything has been allocated, filled and enabled.
glDrawArrays(GL_POINTS, 0, pointCloud->count());
这很好用。
但是,我需要渲染网格而不仅仅是点。为了实现这一点,最明显的方法似乎是使用GL_TRIANGLE_STRIP和glDrawElements以及良好的索引数组。
因此,我首先将我当前的代码转换为应该呈现完全相同的东西。
// Creates a set of indices of all the points, in their natural order
std::vector<GLuint> indices;
indices.resize(pointCloud->count());
for (GLuint i = 0; i < pointCloud->count(); i++)
indices[i] = i;
// Populates the element array buffer with the indices
GLuint ebo = -1;
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size(), indices.data(), GL_STATIC_DRAW);
// Should draw the exact same thing as the previous example
glDrawElements(GL_POINTS, indices.size(), GL_UNSIGNED_INT, 0);
但它不能正常工作。它呈现的东西似乎只是积分的第一个四分之一 如果我将索引范围缩小2或4倍,则会显示相同的点。如果它小8倍,只有它们的前半部分 如果我只用偶数索引填充它,则显示同一组点的一半 如果我在该组的一半处开始,则不会显示任何内容。
与glDrawArrays相比,显然我忽略了glDrawElement的行为方式。
提前感谢您的帮助。
答案 0 :(得分:3)
作为glBufferData()
的第二个参数传递的大小以字节为单位。发布的代码会传递索引数。电话需要是:
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
indices.size() * sizeof(GLuint), indices.data(), GL_STATIC_DRAW);