[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Java3Djp:00819] Re: About offscreen image
------------------------------------------------------------------------
■■■ ■■■ ■■■ ■■■■■ FTP+CGI+SSI+MAIL+SubDomain+転送量無制限!
■ ■ ■ ■ ■ ■ 333円/10MB月額相当換算〜ご用意しています
■■■ ■■■ ■■■ ■■■■■ 25MB 35MB 50MB 100MB 安さ日本屈指です
■ ■ ■ ■ ■ INTERNET Watch[1999-7-27_1] 製品情報掲載
■■■ ■■■ ■■■ ■ ■ http://www.moon.ne.jp/ CLICK!!クリック!!
------------------------------------------------------------------------
小池です。
At 20:02 99/08/17 +0900, kernel wrote:
> 小原@カーネル です。
>
> Java3Dでダブルバッファリング使用時、オフスクリーンイメージの
> 内容が実画面にフラッシュされるタイミングの取得法を探しています。
>
> GraphicsContext3DクラスのreadRasterメソッドを使って
> 実画面に描画したイメージのカラーバッファとデプスバッファの
> 値を取得したいのですが、readRasterを行うべきタイミングが
> 取得できずに困っています。
>
> 最初はCanvas3DクラスのpostSwapメソッド内で行えば大丈夫だろう
> と考えていたのですが、postSwapの時点はまだオフスクリーン
> イメージの作成が完了しているだけで、実画面には内容が反映されて
> おらず、ここで行うのは早すぎるようです。
一応、手元にある限りの資料では、postSwap()はバッファのスワップの
後に呼ばれる、ということになっているのですが、まだ実画面には
内容が反映されていない、というのは、具体的にはどういうことが
起きるのでしょうか?
画面が更新される前なのに、更新後の絵が得られる、ということで
しょうか。もし逆に、更新前の絵が得られてしまうということなら、
ちょっと原因に心当たりがあります。
しばらく前にSUNのJava3Dチームの人から、こんな投稿がjava3d-
interest MLにありました。
8/3の日付で、「Re: [JAVA3D] postSwap call rate」というsubject
です。アーカイブにアクセスできないので、URLはわかりません。
以下に引用します。
> The 1.1.* implementation has a known problem that a single change to the
> scene graph can cause 2-4 renders on a canvas. These are seperate frame
> renders each time, so you would see 2-4 postSwap() calls. You should
> not see 2-4 postSwap() calls for each frame.
>
> Doug Twilleager
> Java 3D Team
一つの変更で何度もpostSwap()が呼ばれるが、これは1つの
フレームを描画するためのものでなくて、全部別々のフレーム
なんだ、ということですね。
ちょっと試してみたのですが、Canvas3DのstopRenderer()を呼んで
レンダリングをとめておき、startRenderer()を呼んでやると、
ただそれだけで3回程度のpostSwap()が呼ばれました。
また、このとき、最初の1度目のpostSwap()で取得したrasterは、
きれいに真っ白の(それまで画面に書かれていたのと同じ)
絵でしたが、最後のpostSwap()では画面に表示されたのと同じ
ものが取得できました。
ということで、postSwapの呼ばれるタイミングがスワップの前と
いうことではなく、古い内容の絵が作りなおされて、実際に
画面に書かれているということかもしれません。新しい絵の
情報が完成する前から、レンダリングループが回り出して
しまうということでしょうか。
そうだとすると、ちょっと美しい解決がむずかしいような気が
します。なんとか、最後のレンダリングかどうかを知れれば
いいのですが。
もし小原さんのシーングラフに、勝手に動くオブジェクトがない
のであれば、テストを繰り返してみて、もしpostSwap()の呼ばれる
回数が決まってくるようなら、postSwap()内で回数を数えて、
最後の時にバッファを取得するという手もありそうです。
ただ、引用したメールでは2-4回、と言われているので、あまり
回数は信用できない気がします。
適当な時間内に呼ばれたpostSwap()で毎回バッファを取得し、
最後のものを使うようにすることも考えられます。
いずれにしても、私にはあまりきれいな手が思いつきません。
別に投稿した問題のこともありますし、時間に余裕があるの
でしたら、Java3Dの1.2を待つのが吉かもしれません。
/* written by Koike,T. */