/**/

チュートリアル 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オブジェクトなので詳細には説明しませんが、結果として、[ESC](エスケープ)キーをトグルスイッチとして jit.window オブジェクトに送る fullscreen 0fullscreen 1を切り替えています。(チュートリアル14の「フルスクリーン表示」のセクションを参照してください)

・[esc] キーを押して、jit.window オブジェクトをフルスクリーンモードに切り替え、元に戻して下さい。

エスケープキーはフルスクリーンモードに切り替えるための一般的な方法と考えられるため、多くのサンプルパッチでこの設定を使っています。しかし、これが単なる慣習であることをぜひとも覚えておいて下さい。Jitterではこの目的のためにどのキーを使うことも可能です。

fullscreen メッセージと共に 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 オブジェクトに送られます。2つのオブジェクト jit.gl.gridshapet l b erase がこのメッセージを受け取ります。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 オブジェクトと同じ大きさです。

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

明るいグレーを背景にしたシアン色のボールが見えるはずです。これは、OpenGLによって生成された赤いボールの画像が jit.opオブジェクトで処理されているためです。ここでは、各カラーコンポーネントが255から引かれるため、画像の色が反転しています。


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

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

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

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

OpenGLシーンを異なるデスティネーションに移動させるためには、jit.gl.render オブジェクトだけではなく、シーンの描画に関わるGLグループオブジェクトも drawto メッセージを受信する必要があります。なぜ、全体のシーンを移動させるために、レンダラーにメッセージを送るだけではなくこのような指示が必要なのでしょうか。それは、1つ1つのレンダラーと同様に、個々のGLグループオブジェクトも独立したデスティネーションを持つことができるためです。GLグループ内のオブジェクトは、複数のレンダラー間を移動することができます。これがなぜ役に立つのかを示す例を見るために、このチュートリアルのもう一つのパッチを調べてみましょう。

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

右側には A、B、Cという名前を付けられた3つの jit.pwindow オブジェクトがあります。これらの jit.pwindow オブジェクトは前もって名前を付けられていて、その名前がパッチファイルに保存されているため、jit.pwindowの上にあるメッセージボックスは厳密に言えば必要ありません。ここでは、メッセージボックスはラベルとして、またオブジェクトに名前をつけるために送信するメッセージを示すものとして使われています。

このパッチには3つの jit.gl.render オブジェクトがあり、それぞれ異なったデスティネーションを持っています。

・Start Renderingと表示された toggle をクリックして下さい。

これにより、3つのレンダラーのそれぞれに、erasebang 、という連続したメッセージが繰り返し送信されます。最も上の描画デスティネーションには、青い円の中に黄色い円が表示されるはずです。この単純なOpenGLシーンは、パッチの左下にある2つの jit.gl.gridshape オブジェクトによって生成されます。各オブジェクトの描画デスティネーションは、3つの描画デスティネーションの中の任意のものに変更することができます。


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

・チュートリアルパッチのSwitch Destinationsという部分の上側にある、Bと書かれたメッセージボックスをクリックして下さい。これにより、青い円のデスティネーションが “B” という名前の描画コンテキストに変更されます。青い円は、直ちに中央の jit.pwindow に表示されます。

・チュートリアルパッチのSwitch Destinationsという部分の下側にある、Bと書かれたメッセージボックスをクリックして下さい。これにより、黄色い円のデスティネーションが“B” という名前の描画コンテキストに変更されます。2つのオブジェクトは再びいっしょになります。

jit.gl.render オブジェクトは、 bang メッセージを受け取るごとに、そのコンテキストに加えられているすべてのGLグループオブジェクトを描画します。オブジェクトはコンテキストに加えられた順番で描かれます。このケースでは、黄色い円は、青い円の後で"B"という名前の描画コンテキストに加えられるため、最前面に描画されます。 この順序を変更するために、 jit.gl.gridshape オブジェクトに drawto B メッセージを送って、再び青い円を描画させることが可能です。これにより、Bという名前のコンテキストが持っているオブジェクトのリストの現在の位置から青い円の描画が削除され、リストの最後に再び追加されます。

・チュートリアルパッチのSwitch Destinationsという部分の上側にある、Bと書かれたメッセージボックスを再度クリックして下さい。青い円は黄色い円を覆い隠します。


青い円は黄色い円を覆い隠します

まとめ

複数のOpenGLレンダラーや描画デスティネーションを生成し、drawto メッセージを使ってそれらの間でGLグループの中のオブジェクトを移動させる柔軟なシステムを紹介しました。

jit.windowjit.pwindowjit.matrix という3つのJitterオブジェクトは、描画デスティネーションとしての働きを持っています。各種の描画デスティネーションのには、それぞれ異なった用途があります。jit.window オブジェクトは、別のモニタへの移動や、画面全体への拡大を行なうことができます。jit.pwindow オブジェクトはパッチの中の表示位置を保持します。 jit.matrix オブジェクトはレンダリングのためのオフスクリーンバッファとして使用されます。 jit.matrix オブジェクトの出力はラスタライズされた3Dシーンの画像で、これに対して更にビデオ処理を適用することができます。