OpenGL仅从顶点数组中绘制一些索引

Posted

技术标签:

【中文标题】OpenGL仅从顶点数组中绘制一些索引【英文标题】:OpenGL Draw only some indexes from vertex array 【发布时间】:2015-10-02 16:02:58 【问题描述】:

如何在 OpenGL 中只从顶点数组中绘制选定的索引?

例如,我正在绘制像点一样的顶点,其中一些变量 m_pointCloud 包含我的点云顶点(点):

glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glPointSize(m_pointSize * point_scale);

glColorPointer(4, GL_UNSIGNED_BYTE,
    static_cast<GLsizei>(sizeof(DensePoint)), &((*m_pointCloud)[0].r));
// glNormalPointer(GL_FLOAT,
//  static_cast<GLsizei>(sizeof(DensePoint)), &((*m_pointCloud)[0].n_x));
glVertexPointer(3, GL_FLOAT,
    static_cast<GLsizei>(sizeof(DensePoint)), &((*m_pointCloud)[0].x));

glDrawArrays(GL_POINTS, 0, static_cast<GLsizei>(m_pointCloud->size()) - 1);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

但我有一些 std::vector&lt;size_t&gt; indices 包含我想要绘制的来自 m_pointCloud 的索引。这是怎么做到的?

【问题讨论】:

使用索引缓冲区 (GL_ELEMENT_ARRAY_BUFFER) 和/或使用 glDrawElement 进行绘制。 但是使用glVertexPointer可以做到吗?你能举个例子吗? 【参考方案1】:

使用glDrawElements代替glDrawArrays。

例如:

std::vector<GLuint> indices;

// populate vertices

glDrawElements(GL_POINTS, indices.size(), GL_UNSIGNED_INT, reinterpret_cast<void*>(indices.data()));

另请注意,您不能使用 size_t 作为索引类型,因为 OpenGL 仅允许 8、16 和 32 位索引。

【讨论】:

我如何指定顶点颜色?因为我想使用数组中的原始颜色,但我也想用红色绘制剩余的点(不包括在 índices 向量中) 与 OpenGL 中的大多数东西一样,有多种方法可以实现这一点。最简单的方法(不涉及编写着色器或存储大量额外数据)可能是正常绘制彩色点,禁用颜色指针数组,将 glColor 设置为红色,然后重绘剩余的点。

以上是关于OpenGL仅从顶点数组中绘制一些索引的主要内容,如果未能解决你的问题,请参考以下文章

opengl绘制三角形

OpenGL- glDrawElements 只绘制第一个元素

将 OpenGL 绘制列表转换为顶点数组或 VBO

C++ OpenGL,绘制形状返回错误

无法使用 VAO 和 EBO (openGL) 绘制多个对象

如何在 OpenGL 中的单个绘制调用上绘制多个顶点数组?