チュートリアル31

レンダリング・ディスティネーション


前のチュートリアルでは、jit.gl.renderオブジェクトを使い、jit.windowオブジェクトにどうやってOpenGLグラフィックスを描画するのかを見てきました。今度は、jit.gl.renderオブジェクトが描画可能な別の種類の送り先(ディスティネーション)について、何のために使えるのか、また、どうやって送り先を切り替えるのかを見てみましょう。

・Jitter Tutorialフォルダにある31jRenderDestinations.patというチュートリアルパッチを開いてください。

左上に他のオブジェクトに混ざってinkyアーギュメントが付いたjit.gl.renderオブジェクトがあります。チュートリアル30では、jit.gl.renderの最初のアーギュメントとして、名前が付けられたレンダリングの送り先が指定されているのを見ました。パッチの右上には、そのような送り先のinkyと名付けられた jit.windowオブジェクトがあります。

・パッチの左上の"Start Rendering"というラベルが付いているtoggleをクリックしてください。

jit.windowオブジェクトに、赤いボールが表れるのが見えるはずです。jit.gl.gridshapeオブジェクトはボールを描画しています。その最初のアーギュメントのinkyは、jit.gl.renderオブジェクトによって jit.windowに描画されているドローイングコンテキストを指定しています。他のアーギュメントは、ボールのcolorやscaleアトリビュートを設定しています。


inkyと名付けられたウィンドウ上に赤いボールを描画します


描画とスワッピングバッファ

toggleをクリックすることでqmetroオブジェクトがスタートし、qmetroオブジェクトはt b b erase オブジェクトに対してbangメッセージを送ります。triggerオブジェクトはjit.gl.renderオブジェクトに対して、最初にeraseメッセージ、続けてbangメッセージを送り、それからパッチの他の部分で使われるbangメッセージを送ります。

jit.gl.renderオブジェクトがbangメッセージを受信したとき、その送り先を共有しているすべてのGLグループオブジェクトが描画を行い、そして、そのオフスクリーンバッファがあればそれを画面にコピーします。オフスクリーンバッファは画面上に見えないメモリの領域で、描画先と同じサイズです。デフォルトでは、すべての描画コンテキストがオフスクリーンバッファを持っています。描画がバッファに対して行われた後、それを見られるように画面へコピーされなければなりません。

これまで見ているように、オフスクリーンバッファは描画のちらつきを無くし、アニメーションを可能にします。そのバッファは赤いボールが描かれる毎に、その前に消去されますが、その消された状態のバッファは見られません。オフスクリーンバッファがないような描画を見るために、パッチの右上にあるメッセージボックスのdoublebuffer 0をクリックしてください。おそらく画像がちらつき始めるのが見えるでしょう。これはeraseメッセージが、オフスクリーンバッファでなく、ウィンドウ自体を消すことによって発生しています。そのウィンドウには、赤いボールが描かれる前に短いですが不定な間隔で空白が残るので、消去されたウィンドウの赤と暗いグレーがちらついているボールの領域を見ることができます。オフスクリーンバッファを作り直してちらつきを止めるために、メッセージボックスのdoublebuffer 1をクリックしてください。


フルスクリーンモード設定

p fullscreenサブパッチは、keyオブジェクト、selectオブジェクト、toggle、メッセージボックス、そしてjit.windowオブジェクトにサブパッチの結果を送るoutletオブジェクトを含んでいます。これは標準的なMaxの要素なので詳細には説明しませんが、結果として、エスケープキーでjit.windowオブジェクトに送るfullscreen 0とfullscreen 1を切り替えます。(チュートリアル14の“フルスクリーンディスプレイ”の節をご覧ください)

jit.windowオブジェクトをフルスクリーンにしたり、元に戻したりするために、'esc'キーを押してください。

エスケープキーはフルスクリーンモードに切り替えるための一般的な方法のようですので、多くのパッチの例でこの設定を使っています。しかし、重要な注意として、これはただの慣習であり、Jitterではこの目的のためにどのキーを使うこともできます。

画面全体への表示に加えて、メニューバーを隠すためにfullecreenメッセージと一緒にfsmenubarメッセージを使うことができます。


jit.pwindowの送り先設定

jit.gl.renderオブジェクトは、3つの異なった種類の送り先に描画することができます。チュートリアルパッチの右側には、jit.windowjit.pwindowjit.matrixといった各オブジェクトの例があります。
現在はjit.windowオブジェクトにレンダリングしています。jit.pwindowオブジェクトに送り先を変えるには、まずjit.pwindowオブジェクトに名前を付け、それからjit.gl.renderオブジェクトと jit.gl.gridshapeオブジェクトの送り先を設定します。

jit.pwindowオブジェクトの最上部にあるname blinkyというメッセージボックスをクリックしてください。

これはjit.pwindowオブジェクトに名前を付け、レンダリングの送り先として使えるようにしています。
描画をこの送り先に切り替えるため、jit.gl.renderオブジェクトとjit.gl.gridshapeオブジェクトの両方にメッセージを送って、それらに新しい送り先を教えることが必要です。

・パッチのSwitch Destinations部分のblinkyというメッセージボックスをクリックしてください。

drawtoシンボルがblinkyメッセージの前に付け加えられ、その結果がs destオブジェクトに送られます。 jit.gl.gridshapet l b eraseの2つのオブジェクトがこのメッセージを受け取ります。triggerオブジェクトはjit.gl.renderオブジェクトに対してメッセージ列を送ります。これは、次のことを伝えます。

1. 現在の送り先の描画バッファを消去する

2. そのバッファを画面に表示し、古い送り先を完全にクリアする

3. 今後の描画を新しい送り先に切り替える

その結果、赤いボールはパッチの右側にあるjit.pwindowオブジェクトに表示されます。


jit.pwindowオブジェクト内でのレンダリング出力の様子


jit.matrixの送り先設定

jit.windowオブジェクトとjit.pwindowオブジェクトへの描画に加えて、jit.matrixオブジェクトにも描画できます。前述のjit.windowの送り先の説明で、オフスクリーンバッファを紹介しました。2次元のjit.matrixオブジェクトがレンダリングの送り先になっているとき、jit.matrixデータはオフスクリーンバッファとして使われます。そして、OpenGLシーンの画像は、ビデオデータと同じフォーマットになります。それによって、その画像に対してどんなJitterのビデオ処理エフェクトもかけることができるのです。

jit.matrixオブジェクトは、OpenGLグラフィックスを描画するためにいくつかの基準を満たす必要があります。

・charデータの4つのプレーンであること

・2次元であること

・幅と高さの両方が8ピクセルよりも大きいこと

チュートリアルパッチの右下隅には、そのようなマトリクスがあります。その幅は160ピクセル、高さは90 ピクセルで、その下にあるjit.pwindowオブジェクトと同じ大きさです。

jit.matrixオブジェクトに描画するため、パッチのSwitch Destinations部分にあるメッセージボックスのclydeをクリックしてください。

明るいグレーの背景に青緑色のボールが見えるはずです。これは、OpenGLによって生成された赤いボールの画像がjit.opオブジェクトを通して処理され、各色要素は255から引き算されて反転しています。


jit.matrixへの出力をラスタライズします


jit.matrixオブジェクトへの描画について、もう一点重要な内容があります。qmetroオブジェクトの下に、triggerオブジェクトのt b b eraseがあることに注意してください。このオブジェクトの最も左の(それゆえ最後の)bangメッセージは、描画しているjit.matrixオブジェクトに送られます。これは jit.pwindowで画像を見るために必要です。jit.gl.renderオブジェクトがbangメッセージを受け取ったとき、jit.matrixオブジェクトのオフスクリーンバッファにおける描画の構築は終わります。しかし、それを見たり他の処理をするために結果のマトリックスを送るには、jit.matrixオブジェクトに対してbangメッセージを送る必要があります。

ハードウェア対ソフトウェアのレンダリング:グラフィックスのレンダリングのためにOpenGLを使用する大きなアドバンテージの一つは、その多くの処理がコンピュータ内のグラフィックスアクセラレータハードウェアによって行われ、CPUをオーディオ生成のような他の処理のために自由にできることです。 jit.windowオブジェクトやjit.pwindowオブジェクトに描画するときには、ハードウェアレンダラーが使われます。残念ながら、現在のシステムソフトウェア(Mac OS 9)の制限により、ハードウェアレンダラーはjit.matrixオブジェクトに直接描画することができません。これはOpenGLの固有の制限ではなく、将来的に変わるかもしれません。しかし、これは、Jitterマトリクスに直接描画することが、 jit.windowjit.pwindowオブジェクトへの描画よりも著しく遅いことを意味します。複雑なシーンやテクスチャを含む場合は特に遅くなります。



複数のレンダラーと描画順序

OpenGLシーンを違う送り先に移すためには、シーンを描画するのに関わるGLグループオブジェクトだけでなく、jit.gl.renderオブジェクトもdrawtoメッセージを受け取らなければなりません。なぜ、レンダラーにメッセージを送るだけではなく、全体のシーンを移すためにそう指示するのでしょうか。その理由は、各レンダラーだけでなく、各GLグループオブジェクトが独立した送り先を持っているからです。GLグループ内のオブジェクトは、複数のレンダラー間を移ることができます。これがなぜ役に立つのかという一つの例を見るために、このチュートリアルのもう一つのパッチを見てください。

・31jMoreRenderDestinations.patというチュートリアルパッチを開いてください。

右にA、B、Cと名付けられた3つのjit.pwindowオブジェクトがあります。厳密には、それらの上のメッセージボックスオブジェクトは必要ありません。なぜなら、jit.pwindowオブジェクトはそれ以前に名前を付けられているからで、その名前はパッチ内に一緒に保存されています。しかし、それらはラベルとして、またオブジェクトを指定するために何のメッセージを送るべきかという覚え書きとして、ここでは役に立ちます。

このパッチには3つのjit.gl.renderオブジェクトがあり、それぞれ異なった送り先を指しています。

・Start Renderingとラベルが付いたtoggleをクリックしてください。

これは3つのレンダラーのそれぞれに、eraseメッセージに続けて、bangメッセージを繰り返し送ります。最上部の描画先に、青い丸に入った黄色い丸が見られるはずです。この単純なOpenGLシーンは、パッチの左下にある2つのjit.gl.gridshapeオブジェクトによって生成されます。これらの各オブジェクトを、3つのうちの任意の描画先に移すことができます。


jit.pwindow Aへのレンダリング


・チュートリアルパッチのSwitch Destinations部にあるBと書いてある上側のメッセージボックスをクリックしてください。これは青い丸の送り先を“B”と名付けられた描画コンテキストに変更し、それはすぐにjit.pwindowの真ん中に現れます。

・チュートリアルパッチのSwitch Destinations部のBと書いてある下側のメッセージボックスをクリックしてください。これは黄色い丸の送り先をと名付けられた描画コンテキストに変更します。その2つのオブジェクトは再び一緒になります。

jit.gl.renderオブジェクトがbangメッセージを受け取った各時間に、そのコンテキストに加えられているすべてのGLグループオブジェクトが描かれます。オブジェクトはコンテキストに加えられた順番で描かれます。この場合、黄色い丸は“B”と名付けられた描画コンテキストに青い丸の後で加えられるので、最上面に現れます。この順番を変更するため、jit.gl.gridshapeオブジェクトに青い丸を描くdrawto Bメッセージをもう一度送ることができます。これはBと名付けられたコンテキストに対して、オブジェクトのリスト上の現在の位置からそれを削除し、そのリストの最後に再度追加するでしょう。

・チュートリアルパッチのSwitch Destinations部のBと書いてある上側のメッセージボックスをクリックしてください。すぐに青い丸が黄色い丸を隠すことでしょう。


青い丸が黄色い丸を隠します


まとめ

複数のOpenGLレンダラーと描画先の生成をしたり、drawtoメッセージを使ってそれらの間でGLグループのオブジェクトを移すための柔軟なシステムについて紹介しました。

3つのJitterオブジェクトjit.windowjit.pwindowjit.matrixは、描画先として機能します。送り先の種類には異なった用途があります。jit.windowオブジェクトは違うモニタへの移動や、画面全体に拡大されることが可能です。jit.pwindowオブジェクトはパッチにおけるその位置を保持します。 jit.matrixオブジェクトはレンダリングのためのオフスクリーンバッファとして使われるでしょう。 jit.matrixオブジェクトの出力は3Dシーンのラスタライズされた画像で、さらなるビデオ処理を加えることができます。