繁体   English   中英

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

[英]How to draw path like canvas in Android using OpenGL ES 2?

我已经在Android中尝试过Canvas,并且可以通过在屏幕上移动手指来绘制草图或路径。 现在,我想使用OpenGL 2做同样的事情。我是OpenGL编程的新手,但是我尝试了几种使用GLES20.glDrawArray(...)和Line Shape类绘制线条的方法,但这仍然使一条直线,不像我使用画布时想要的自由形式的路径。 而且,如果我每次ACTION_MOVE尝试绘制每个线段,由于将每个线段存储在ArrayList中,经常会发生并发修改异常。 OpenGL是否有任何帮助API来实现这一目标? 如果有或没有,我该怎么做? 谢谢!

如果要沿路径绘制一致的线,则实际上是在尝试绘制许多短线,这些短线相互连接。

我认为最直观的方法是将路径上的每个点添加到点数组中,然后维护一个浮动缓冲区,其中每三个项描述路径上的单个点(x,y,z)。 然后,对于添加到此顶点缓冲区的每个点,应在索引缓冲区中添加两个整数。 如果您不熟悉索引缓冲区,它的工作方式(当您处理行时)是告诉OpenGL哪个顶点连接了两个。 例如:

假设您有3分。 在顶点缓冲区内,您将有9个浮点数-3点*每个点3个坐标。 我们希望第一点连接到第二点,第二点连接到第三点。 我们可以使用索引缓冲区来做到这一点。 在索引缓冲区中,我们将为每个顶点连接放置2个整数。 为了将第一个点连接到第二个点,我们将播放器0和1放入缓冲区。 这表示顶点缓冲区中的第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”样式循环),则将发生这种情况。 一个好的解决方案是用一个syncize块将与点数组的任何交互包围起来,并将数组本身用作互斥体:

Adding:
synchronized(myPointArray)
{
  myPointArray.add(newPoint);
}


Iterating:
synchronized(myPointArray)
{
  for (PointF point : myPointArray)
  {
    // do stuff with the point
  }
}

这应该使您入门。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM