Java 如何使用OpenGL ES 2在Android中绘制类似画布的路径?
我在安卓系统中尝试过画布,我可以通过在屏幕上移动手指来绘制草图或路径。 现在,我想用OpenGL2做同样的事情。 我是OpenGL编程新手,但我尝试了几种使用GLES20.glDrawArray(…)和Line Shape类绘制直线的方法 但是,这只是一条直线,不像我使用画布时想要的自由形式的路径。 而且,如果我每次尝试在动作移动时绘制每个线段,那么并发修改异常经常发生,因为我将每个线段存储在ArrayList中。 OpenGL有没有帮助API来实现这一点? 如果有或没有,我怎么做?Java 如何使用OpenGL ES 2在Android中绘制类似画布的路径?,java,android,opengl-es,android-canvas,Java,Android,Opengl Es,Android Canvas,我在安卓系统中尝试过画布,我可以通过在屏幕上移动手指来绘制草图或路径。 现在,我想用OpenGL2做同样的事情。 我是OpenGL编程新手,但我尝试了几种使用GLES20.glDrawArray(…)和Line Shape类绘制直线的方法 但是,这只是一条直线,不像我使用画布时想要的自由形式的路径。 而且,如果我每次尝试在动作移动时绘制每个线段,那么并发修改异常经常发生,因为我将每个线段存储在ArrayList中。 OpenGL有没有帮助API来实现这一点? 如果有或没有,我怎么做? 谢谢 如果
谢谢 如果你想沿着一条路径画一条一致的线,那么你实际上是在画许多相互连接的短线 我认为最直观的方法是将路径上的每个点添加到一个点数组中,然后维护一个浮动缓冲区,其中每3个项描述路径上的一个点(x、y、z)。然后,对于添加到此顶点缓冲区的每个点,应将两个整数添加到索引缓冲区中。如果您不熟悉索引缓冲区,那么它的工作方式(当您使用线时)就是告诉OpenGL哪两个顶点是连接的。例如: 假设你得了3分。在顶点缓冲区内,您将有9个浮动-每个点有3个点*3个坐标。我们希望第一个点连接到第二个点,第二个点连接到第三个点。我们可以通过使用索引缓冲区来实现这一点。在索引缓冲区中,我们将为每个顶点连接放置2个整数。为了将第一个点连接到第二个点,我们将把玩家0和1放入缓冲区。这表示顶点缓冲区中的前3个坐标连接到顶点缓冲区中的第2个3个坐标。然后,我们将在索引缓冲区中放置1和2。这表示顶点缓冲区中的第2个3坐标连接到顶点缓冲区中的第3个3坐标,依此类推
Vertex Buffer:
{
0, 0, 0, // Index 0
1, 1, 1, // Index 1
2, 3, 4 // Index 2
}
Index Buffer:
{
0, 1, // Connect Index 0 to Index 1
1, 2 // Connect Index 1 to Index 2
}
您需要调用glDrawElements
而不是glDrawArrays
,但想法是一样的-您只需要为索引维护一个额外的缓冲区,并确保每次添加新点时始终更新两个缓冲区
至于并发修改异常,这里您需要小心一点。如果在迭代数组时向数组中添加一个点(例如,使用“for each”样式的循环),则会发生这种情况。一个好的解决方案是使用同步块围绕与点阵列的任何交互,并将阵列本身用作互斥体:
Adding:
synchronized(myPointArray)
{
myPointArray.add(newPoint);
}
Iterating:
synchronized(myPointArray)
{
for (PointF point : myPointArray)
{
// do stuff with the point
}
}
这应该让你开始