gpt4 book ai didi

java - 如何使用 OpenGL ES 2 在 Android 中绘制像 Canvas 一样的路径?

转载 作者:行者123 更新时间:2023-11-29 21:04:21 25 4
gpt4 key购买 nike

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

最佳答案

如果您想沿着一条路径画出一条连贯的线,那么您实际上是在尝试画出许多相互连接的短线。

我认为最直观的做法是将路径上的每个点添加到一个点数组中,然后维护一个浮点缓冲区,其中每 3 个项目描述路径上的一个点 (x,y, z).然后,对于添加到该顶点缓冲区的每个点,您应该将两个整数添加到索引缓冲区中。如果您是索引缓冲区的新手,那么它的工作方式(当您使用线时)是否会告诉 OpenGL 连接了哪两个顶点。例如:

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

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


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

这应该可以帮助您入门。

关于java - 如何使用 OpenGL ES 2 在 Android 中绘制像 Canvas 一样的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25021991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com