我正在创建一个需要绘制多个线段的应用程序,每个线段以一种颜色开始,另一种颜色结束。 目前我在我的计算循环中有下面的代码,但这似乎有点过分,以实现我想要的,特别是如果该行可能是数百个段长。
我是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);
答案 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)
我并不完全明白你的问题是什么,但我同意抽取数百个细分并不是最好的解决方案......
你想做什么?