glDrawElements不会渲染所有点

时间:2014-09-06 00:38:39

标签: c++ opengl

首先,我使用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的行为方式。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

作为glBufferData()的第二个参数传递的大小以字节为单位。发布的代码会传递索引数。电话需要是:

glBufferData(GL_ELEMENT_ARRAY_BUFFER,
             indices.size() * sizeof(GLuint), indices.data(), GL_STATIC_DRAW);