4

だから私がJavaを理解するようになったとき

paint(Graphics g){}

メソッド私は独自のレンダリングメソッドの作成に移りましたが、バッファ戦略とグラフィックスを「取得」する方法について学ぶ必要がありました

だから今私はopenGLを学んでいるので、私はその方法を理解しなければなりません:

@Override
public void display(GLAutoDrawable arg0){}

そして今、私は独自のレンダリングメソッドを作成したいと思います。これまでのところ、私は常に1つの例外に直面しています。

スレッド「メイン」の例外javax.media.opengl.GLException:このスレッドには現在のOpenGLコンテキストがありません

編集:質問:外部でglDraw呼び出しを行いたい場合

@Override
public void display(GLAutoDrawable arg0){}

メソッド、GLCanvasのglContextが「最新」であることを確認するにはどうすればよいですか

できればコード例として、私がAPIを調べ、グーグルを広範に使用したので、皆さんがすでにここに置くほど親切な多くのリンクは、私が以前に見つけたものであり、私はまだ空白を描いています...文字通り!私が持っている最も近いのは、「現在のコンテキストがない」例外をスローしなかったが、画面が永続的に真っ暗になったときでした。

4

3 に答える 3

3

あなたの他の質問に対する私の答えを複製する:

奇妙に思われるかもしれませんが、これはそれが機能することになっている方法です。

舞台裏では、作成したGLCanvasが描画されるようになると、舞台裏でJOGLが多くの作業を行っています。GLContextを作成し、現在のスレッドのGLCanvasに対して最新のものにします。それが行われた場合にのみ、レンダリング呼び出しを行うことができます。現在になっていないGLContext、またはそれから派生したGLオブジェクトは、役に立ちません。

ほとんどすべてのJOGLアプリケーションはそのように機能します。GLEventListenerを作成し、その中にdisplay()を実装し、GLAutoDrawableからGLを抽出し、それを使用してレンダリング呼び出しを行います。paint()メソッドの外部でGraphics2D呼び出しを行う以上に、他の場所でレンダリング呼び出しを行う必要はありません。(もちろん、display()メソッドから呼び出され、引数としてGLまたはGLAutoDrawableを受け取るサブメソッドを作成できます)。

GLContextを具体的に作成し、それを自分で最新のものにする方法はいくつかありますが、それらが必要になることはめったにありません。ほとんどの場合、ここでのアプローチを使用することをお勧めします。

BufferStrategyのような低レベルのバッファを使用している場合、最善の策は、オフスクリーンのJOGLドローアブルであるGLPBufferに対してJOGLレンダリングを行うことです。GLPBufferを作成し、それにレンダリングしてから、レンダリングされたビットマップをバッファーにコピーします。GLDrawableの一部の実装では、「createOffscreenDrawable(...)」を使用してオフスクリーンドローアブルを明示的に作成できます。この記事では、いくつかの指針を示します。

レンダリングスレッドを使用している場合は、GLDrawable.display()を明示的に呼び出すこともできます。

ディスプレイリストの作成などの初期化を行う場合は、GLDrawable.init(...)メソッドを使用できます。このメソッドは、display(...)を最初に呼び出す前に呼び出されますが、さらに呼び出すこともできます。一度より。

于 2011-09-15T19:35:05.073 に答える
3

この問題について説明しているドキュメントをここで見つけました:

http://fivedots.coe.psu.ac.th/~ad/jg2/ch15/index.html

GLContext.makeCurrent()/ release()ハックは、Linux / OpenJDK 6 / JOGL 2で機能するようですが、特に、OpenGLコンテキストスイッチスレッドを常にそのようにすることで(あまりにも)発生します。多く?)オーバーヘッド。

次に、JOGL 2のNEWTとLWJGLのツールキットがありますが、それらは処理するためのまったく新しいワックスのボールのようです、さようならスイング。:(

于 2011-09-17T13:45:53.717 に答える
0

理由を聞かないでください、しかし私にとって(これほど多くの試みの後)これは魅力のように働いています

変数として宣言しました

private GLCanvas gLCanvas;

そしてただ

gLCanvas.repaint();

仕事をしました;)

于 2012-02-27T09:06:06.643 に答える