簡體   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