2016-08-03 46 views
0

在android-opengles中,我們知道任何基元都可以通過 OnDrawFrame(GL10 gl) {.....} 在Android屏幕上呈現,並且呈現爲連續的。 好像我們要畫它在三角形類中定義的三角形 我們使用如何繪製OnDrawFrame()之外的圖元?

triangle tri=new triangle(); 
OnDrawFrame(GL10 gl) 
{ 
. 
. 
. 
tri.draw(gl); 
. 
. 
. 

} 

所以,我需要的是,我想只要用戶通過

OnTouchEvent(MotionEvent e) 
{ 
. 
. 
. 

tri.draw(gl); 

. 
. 
. 

} 
觸摸 屏幕繪製三角形

有可能嗎?或者還有其他方法嗎?

回答

1

正如已經提到的那樣,你不能直接這樣做。不管線程如何,您都不應該在應用程序的某個隨機點插入圖形,因爲您不知道渲染實際處於什麼狀態。

總是嘗試將邏輯從圖形中分離出來。在你的情況下,這似乎意味着你將需要一個對象(三角形)的數組。無論何時用戶觸摸,都可以向該數組添加一個三角形對象,並在繪製時可以繪製三角形。

現在你有兩個三角形的情況。首先,如果您清除每個繪圖上的緩衝區,那麼該數組應該在觸摸事件中保持增長,並且每個幀都將繪製所有三角形。其次,如果您不清除緩衝區,並且簡單地將一個對象繪製在另一個對象上,那麼只需在繪製它們時從數組中刪除所有對象。

在這兩種情況下,還有一個選項只在調整完成時調用繪圖方法。在這種情況下,最常見的方法是使用類似needsRedraw的布爾值,如果渲染應該觸發,則視圖刷新並將needsRedraw設置爲false。如果添加了另一個三角形,則會再次將值needsRedraw設置爲true。

還有其他一些方法,例如您可以在觸摸事件將報告的另一個線程上創建共享上下文。在此上下文中,您可以創建一個帶有附加紋理的FBO。主要的上下文然後將全屏重繪這個紋理,結果將是相同的......但這是一個更難的過程,沒有理由去實現它。更不用說,你需要確保這兩個線程不相同或不斷改變線程上的當前上下文;在這種情況下,雙緩衝也可能是強制性的,所以我們正在FBO上查看2個紋理,鎖定系統和附件/分離系統。

0

OpenGL ES文檔說應該從同一個線程調用上下文的所有GL命令。在你的情況下,Android和iOS必須從主線程發送命令。您無法從觸摸事件傳遞命令。

我的建議是在觸摸事件中啓用布爾標誌,並在主線程上使用相同的布爾值來繪製某些東西。

+0

是OnDrawFrame()和OnTouchEvent()在不同的線程上運行? – ArunKumarmn

+0

我建議你閱讀下面的答案馬蒂克奧布拉克。他已經詳細介紹了你的問題。 – codetiger

相關問題