2015-10-02 54 views
0

如何仅在OpenGL中绘制顶点数组中的选定索引?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<size_t> indices包含指数从m_pointCloud,我要画。这是如何完成的?

+2

使用索引缓冲区(GL_ELEMENT_ARRAY_BUFFER)和/或使用glDrawElement进行绘制。 – BDL

+0

但是可以用'glVertexPointer'来完成吗?你能提供一些例子吗? – manatttta

回答

2

代替glDrawArrays,请使用glDrawElements

例如:

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位的索引。

+0

以及如何指定顶点颜色?因为我想使用数组中的原始颜色,但我也想用红色来绘制剩余的点(不包括在ndnd矢量中) – manatttta

+1

与OpenGL中的大多数情况一样,有多种方法可以实现这一点。最简单的方法(不涉及编写着色器或存储大量额外数据)可能是正常绘制彩色点,禁用颜色指针数组,将glColor设置为红色,然后重绘其余点。 –

+0

@ReetoKoradi示例修复,谢谢。 –