Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用OpenGL ES 2在Android中绘制类似画布的路径?_Java_Android_Opengl Es_Android Canvas - Fatal编程技术网

Java 如何使用OpenGL ES 2在Android中绘制类似画布的路径?

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来实现这一点? 如果有或没有,我怎么做? 谢谢 如果

我在安卓系统中尝试过画布,我可以通过在屏幕上移动手指来绘制草图或路径。 现在,我想用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
  }
}
这应该让你开始