如何在Android上的OpenGL-ES中绘制不同颜色的多个线段

时间:2010-11-02 14:27:36

标签: android opengl-es

我正在创建一个需要绘制多个线段的应用程序,每个线段以一种颜色开始,另一种颜色结束。 目前我在我的计算循环中有下面的代码,但这似乎有点过分,以实现我想要的,特别是如果该行可能是数百个段长。

我是OpenGL的新手,所以会对如何最好地解决这个问题有所了解。

感谢。

    vertexBuffer.position(0);
    vertexBuffer.put(xyz[0]);
    vertexBuffer.put(xyz[1]);
    vertexBuffer.put(xyz[2]/);
    vertexBuffer.put(nextxyz[0]);
    vertexBuffer.put(nextxyz[1]/;
    vertexBuffer.put(nextxyz[2]);
    vertexBuffer.position(0);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
    gl.glDrawArrays(GL10.GL_LINES, 0, 2);
    gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

2 个答案:

答案 0 :(得分:1)

这是顶点数组的错误使用。它们可以在一次绘制调用中绘制多个基元(在您的情况下为线条),并且每次调用只绘制一条线。

只需将所有线的顶点(当然还有颜色)打包到一个顶点数组(和颜色数组)中,这样顶点2*i和顶点2*i+1组成一行i然后用

一次画出所有的线条
glDrawArrays(GL_LINES, 0, 2*numLines);

如果线段全部连接,您还可以使用线条,其中线的末端顶点用作下一条线的起始顶点(但请记住,在这种情况下,线的末端顶点)当然,它也与下一个的起始顶点具有相同的颜色。这样,您只需要numLines+1个顶点,并可以使用

绘制线条
glDrawArray(GL_LINE_STRIP, 0, numLines+1);

编辑:和Profet一样,当所有线段构成一条连线直线时,您可以使用一条带有1D纹理的单行或片段着色器(尽管可能是对于初学者而言,有点重,可以改变沿线的颜色。

编辑:您的代码建议您希望所有线段使用相同的开始和结束颜色。在这种情况下,您当然不能使用线条。将所有顶点打包到一个数组中以便通过一次调用绘制所有段(第一个建议)意味着重复每行的颜色,但它可能仍然比执行多个glDrawArrays调用更快,特别是如果你构建顶点和颜色数组只有一次。在这种情况下,使用无符号字节颜色而不是浮点(很少需要颜色)也可能有助于提高性能,因为每个顶点只有16个字节要发送到GPU(这也非常对齐)。

答案 1 :(得分:0)

我并不完全明白你的问题是什么,但我同意抽取数百个细分并不是最好的解决方案......

你想做什么?

  • 这些细分是否都在一条线上对齐?
  • 您可以用四边形中绘制的单个纹理替换所有这些线条吗?
  • 您可以根据特定数据计算每个像素的颜色,例如点的坐标吗?在这种情况下,您可以使用片段着色器为每个像素着色。