使用SAME Vertex阵列-Android OpenGL ES1.0显示GL.POINTS和GL.LINES

时间:2012-04-01 12:28:09

标签: android opengl-es 3d

我有一个由3d点组成的顶点数组(每个点的x,y,z值)。我能够将Vertex数组显示为GL.Points和GL.Lines。是否可以使用相同的VERTEX ARRAY显示一半点的GL.Points和其余点的GL.LINES?

感谢。

1 个答案:

答案 0 :(得分:2)

是的,你应该可以。我不确定您使用的是哪个版本的OpenGL ES,但是您可以在设置对glDrawArrays和glVertexAttribPointer的调用方面发挥创意。例如,如果要将顶点数组的前半部分绘制为点,将后半部分绘制为线条,则将glDrawArrays调用两次。

glDrawArrays(mode, first, count)

glDrawArrays(GL_POINTS, 0, vertexarray.length / 2);
glDrawArrays(GL_LINES,vertexarray.length / 2, vertexarray.length/2);

这就是说将从0到vertexarray.length / 2的元素绘制为GL_POINTS,并将vertexarray.length / 2中的元素绘制为vertexarray.length作为GL_LINES。这应该适用于GL ES 1.0和GL ES 2.0。

如果您正在使用GL ES 2.0,那么您可以将顶点数据松散地打包到顶点数组中,并将stride和pointer参数用于glVertexAttribPointer。让我们说你的第一个顶点和每个其他顶点应该绘制为点,其他顶点应该绘制为线。

glVertexAttribPointer(index, size, type, normalized, stride, pointer)

glVertexAttribPointer(handle, 3, GL_FLOAT, false, (4*6), vertexarray.position(0));
glDrawArrays(GL_POINTS, 0, vertexarray.length / 2)

glVertexAttribPointer(handle, 3, GL_FLOAT, false, (4*6), vertexarray.position(1));
glDrawArrays(GL_LINES, 0, vertexarray.length / 2)

(4 * 6)的步幅指定您需要跳过多少字节才能到达下一个属性的开头。这里我们每个浮点数有4个字节,我们需要跳过6个浮点数才能找到下一个属性的开头。基本上,你在这里告诉GL你需要读取当前的x0,y0,z0和下一个x1,y1,z1,以便到达我们关心的下一个顶点x2,y2,z2。在这个例子中,这会将x0,y0,z0和x2,y2,z2绘制为Points,将x1,y1,z1绘制为Lines。