2016-08-03 6 views
0

android-openglesでは、すべてのプリミティブが、連続してレンダリングされる OnDrawFrame(GL10 gl) {.....} によって、アンドロイド画面にレンダリングできることがわかりました。 我々はそうOnDrawFrame()の外にプリミティブを描画する方法は?

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

} 

を使用する三角クラス で定義されている三角形を描きたいかのように、私は必要なもので、私は、ユーザーが

OnTouchEvent(MotionEvent e) 
{ 
. 
. 
. 

tri.draw(gl); 

. 
. 
. 

} 
を通じて 画面に触れるたび三角形を描きたいです

それは可能ですか?または他の方法がありますか?

答えて

1

既に言及したように、直接行うことはできません。スレッドに関係なく、レンダリングが実際にどの状態にあるのか分からないので、アプリケーションのランダムな点に図面を挿入しないでください。

常にロジックを図面から分離してみます。あなたの場合は、オブジェクト(三角形)の配列が必要であると思われるようです。ユーザーが触れるたびに、この配列に三角形オブジェクトを追加して描画することができます。三角形を描くことができます。

ここでは、三角形で2つの状況があります。まず、すべての描画でバッファーをクリアすると、配列はタッチイベントで成長し続け、各フレームではすべての三角形が描画されます。第2に、バッファをクリアせずに一方のオブジェクトを他のオブジェクトに引き続き描画するだけの場合は、描画時にすべてのオブジェクトを配列から削除するだけです。

どちらの場合でも、変更が行われたときにのみ描画メソッドを呼び出すオプションもあります。この場合、needsRedrawのようなブール値を使用することが最も一般的であり、レンダリングがトリガーされるべきであるときには、表示がリフレッシュされ、needsRedrawがfalseに設定される。値needsRedrawは、別の三角形が追加されたような何らかのアクションが行われたときに再びtrueに設定されます。

タッチイベントが報告される別のスレッドで共有コンテキストを作成するなど、いくつかの方法があります。このコンテキストでは、テクスチャを添付してFBOを作成することができます。主なコンテキストは、このテクスチャをフルスクリーンで再描画し、結果は同じになります...これはさらに難しい手順であり、実装する理由はありません。これらの2つのスレッドが同じでないか、スレッドの現在のコンテキストを変更しないようにする必要はありません。また、この場合はダブルバッファリングが必須であるため、FBO、ロックシステム、着脱システムの2つのテクスチャを検討しています。

0

OpenGL ESドキュメントでは、コンテキストのすべてのGLコマンドを同じスレッドから呼び出す必要があります。あなたの場合、AndroidとiOSはメインスレッドからコマンドを送信する必要があります。タッチイベントからコマンドを渡すことはできません。

私の提案は、タッチイベントでブール値フラグを有効にし、メインスレッドで同じブール値を使用して何かを描画することです。

+0

はOnDrawFrame()で、OnTouchEvent()は異なるスレッドで実行されますか? – ArunKumarmn

+0

私はMatic Oblakによって以下の答えを読むことをお勧めします。彼はあなたの質問について詳しく説明しました。 – codetiger

関連する問題