/**/

チュートリアル 34:
テクスチャの使用

このチュートリアルでは、GLグループによって生成された3Dジオメトリデータに対して、テクスチャを生成し、適用する方法について説明します。内容としては、jit.gl.render による名前を持ったテクスチャの生成、GLオブジェクトに対する名前を持ったテクスチャの割り当て、テクスチャと連携した色の使用、イメージやビデオデータのテクスチャへの変換、ジオメトリをテクスチャで覆うための様々な方法について扱います。

・Jitter Tutorialフォルダにある34jUsingTextures.patというチュートリアルパッチを開き、Start Renderingと表示された toggle オブジェクトをクリックして下さい。

白い平行四辺形が見えます。これは、実際には jit.gl.plato オブジェクトによって描かれた4面体です。jit.gl.plato オブジェクトは、4面体、6面体(立方体とも言われます)、8面体、12面体、20面体といった正多面体(プラトンの立体)をレンダリングすることができます。ライティングがオンになっていない状態で、4面体へのテクスチャの適用も行なわれていないため、実際には3Dのシェイプ(形状)であるということはわかりにくいでしょう。

・チュートリアル32で行ったように、マウスを使って、jit.gl.handle オブジェクトによって4面体を回転させてみて下さい。

回転を行なうと、これが実際に3D のシェイプだということがわかりますが、jit.gl.plato オブジェクトにテクスチャを適用すれば、さらにわかりやすくなります。


正多面体の回転

テクスチャとは?

テクスチャとは、本来ジオメトリの表面を覆う画像のことを指します。Jitterでの他の画像と同じように、テクスチャはアルファ、赤、緑、青という要素を持っています。アルファ要素を使うためには、ブレンディングを有効にする必要があります。ブレンディングについては、チュートリアル33で詳しく説明しています。

Jitterでは、テクスチャは名前を持ち、jit.gl.render オブジェクトに属します。その jit.gl.render オブジェクトと関連づけられた描画コンテキストに接続されている他のオブジェクトは、 jit.gl.render オブジェクトに属する、名前を持ったテクスチャを任意に利用することができます。

効率化をはかるために、多くのOpenGLの実装では、テクスチャデータの大きさは、16、32、64といったような2の整数乗であることが要求されます。任意のサイズのテクスチャを認める実装もありますが、Jitterの現在のバージョンではこれをサポートしていません。最小サイズは 1 × 1、そして、最大サイズはOpenGLの実装によりますが、通常 1024×1024です。

テクスチャの生成

・パッチのTexturesと表示されたセクションにある texture grid 64 64というメッセージボックスをクリックして、grid という名前のテクスチャを生成して下さい。このメッセージは jit.gl.render オブジェクトに送信されます。

texture メッセージの最初のアーギュメントはテクスチャの名前、その後の2つはテクスチャの幅と高さを指定しています。このメッセージは、grid という名前で 64×64 のテクスチャを生成し、それをデフォルトのパターン(白とグレーのチェック)で塗りつぶします。しかし、これだけでは何の変化もおこりません。それは、テクスチャがまだジオメトリに適用されていないためです。

・パッチの Platonic Solid と表示されたセクションにある texture grid というメッセージボックスをクリックして4面体にテクスチャを適用して下さい。このメッセージは、jit.gl.plato オブジェクトの texture アトリビュートを設定します。これにより、jit.gl.plato は描画の際に grid という名前のテクスチャを使用するようになります。これでチェックの4面体が見えるはずです。


チェックのテクスチャが適用された4面体

jit.gl.platoオブジェクトは、4面体にテクスチャを貼り付けるする際に、「ギフトラッピング法」を用います。jit.gl.plato のヘルプファイルの中の texture_maps サブパッチには、様々な正多面体がどのように覆われるかについて正確に記述されています。


様々な正多面体へのテクスチャマップの適用方法

重要な注:jit.gl.renderjit.gl.plato オブジェクトは共に texture メッセージを使用しますが、その使い方が異なる点に注意して下さい。jit.gl.render オブジェクトはテクスチャの生成のためにこのメッセージを使いますが、jit.gl.plato や他のGLグループオブジェクトはテクスチャを貼り付けるためにこのメッセージを使います。jit.gl.render オブジェクトには、名前を持ったテクスチャを、Jitterマトリックスとして渡される生のジオメトリデータに貼り付けるためのメッセージ usetexture もあります。Jitterマトリックスとして渡される生のジオメトリデータをレンダリングする jit.gl.render オブジェクトの機能については、チュートリアル37で説明します。

テクスチャと色

ジオメトリにテクスチャを適用する場合、OpenGLは色やライティング情報も考慮するため、描画の際には現在の色とライティングの値がテクスチャ画像に掛け合わせられます。色が白で、ライティングがオフになっていれば、テクスチャの色は変わりません。

・パッチの Platonic Solid と表示されたセクションで、redと表示されたナンバーボックスを 1、greenと表示されたナンバーボックスを 0、blueと表示されたナンバーボックスを 0 に設定し、4面体の色を赤にして下さい。


レンダリングされるオブジェクトの色の操作

・次の内容のために、4面体の色を白(1. 1. 1.)に戻して下さい。

イメージやビデオのテクスチャへの変換

ここまで読み進むと、デフォルトのグレイと白のチェックではないテクスチャを利用したいと思うのではないでしょうか。これは、jit.qt.movie jit.matrix オブジェクトにイメージやムービーをロードし、texture [texture-name] jit_matrix [matrix-name] というメッセージを jit.gl.render オブジェクトに送信することによって可能になります。 [texture-name] で指定されたテクスチャがすでに存在している場合、送られてきたマトリックスは現在のテクスチャの大きさに再度サンプリングされます。その名前のテクスチャが存在していない場合には、新しいテクスチャが生成されます。その大きさは、Jitterマトリックスと同じかそれ以上で最も近い2の累乗になります。

・パッチの Textures と表示されたセクションにある texture picture 128 128というメッセージボックスをクリックして下さい。このメッセージによって picture という名前の128×128 のテクスチャが生成され、これまでと同じようにデフォルトの白とグレイのチェックのパターンで塗りつぶされます。

read colorbars.pict, bangというメッセージボックスをクリックして下さい。これにより、jit.qt.movie オブジェクトに colorbars.pict という画像がロードされ、直ちにpictureという名前のテクスチャに送られます。

ここでは、まだ何の変化も起こりません。これは、jit.gl.platoオブジェクトには、まだ grid という名前のテクスチャが使われているためです。

・パッチの Platonic Solid と表示されたセクションにある texture picture というメッセージボックスをクリックして下さい。

これで4面体の周りを覆うカラーバーの画像が見えるはずです。


テクスチャとしての画像の使用

多くの場合、テクスチャとして使用する必要があるのは静止画だけでしょう。しかし、Jitter では、動画をテクスチャとして使用することもサポートしています。そのためには、 jit.qt.movie オブジェクトの出力を、名前を持ったテクスチャに繰り返しコピーします。

read dishes.mov というメッセージボックスをクリックして、jit.qt.movie オブジェクトにdishes.mov をロードして下さい。

metro オブジェクトに接続された toggle オブジェクトをクリックして、picture という名前のテクスチャへのビデオのコピーを開始して下さい。


ムービーを使ったテクスチャマッピング

補間とテクスチャサイズ

デフォルトでは、テクスチャの補間がオンになっているため、テクスチャのピクセルの間にあるスクリーンピクセルの値には、その近傍の値を補間したものが使用されます。これは、テクスチャに対してブラー(ぼかし)やスムージング(平滑化)といった効果を与えます。補間なしでテクスチャを適用するために、jit.gl.render オブジェクトの interp メッセージを使って補間をオフにすることができます。このメッセージは jit.gl.render オブジェクトのカレント(現在)のテクスチャだけに影響します。そのため [texture-name] という名前を持ったテクスチャの補間を切り替えるためには、interp メッセージを送る前に usetexture [texture-name] メッセージを送って、 [texture-name] というアーギュメントで指定するテクスチャをカレントのテクスチャに設定しておく必要があります。

usetexture picture, interp $1 というメッセージボックスに接続された toggle オブジェクトをクリックして、jit.gl.render オブジェクトが picture という名前のテクスチャを使用するように設定し、pictureという名前のテクスチャに対する補間のオン、オフを切り替えて下さい。

一度テクスチャが生成された後でも、texture [texture-name] [width] [height] というメッセージを送ることによって、テクスチャサイズを変更することができます。[width][height] には新しいディメンション(サイズ)を指定します。

Resize texture と表示されたナンバーボックスを16 に設定して下さい。これにより、 jit.gl.render オブジェクトにメッセージ texture picture 16 16 が送信され、picture という名前のテクスチャが 16×16の画像 にサイズ変更されます。


補間されないテクスチャの使用

jit.gl.render にdelete texture [texture-name] というメッセージを送信することによって、テクスチャを削除し、メモリを解放することができます。

マッピングモード

これまでは jit.gl.plato オブジェクトが提供する既定のテクスチャマッピングをそのまま扱っただけでした。OpenGLでは、ジオメトリデータにテクスチャを適用するために、絶対的なテクスチャマッピングも提供されています。これには、object linear、eye linear、sphere mapというマッピングモードがあります。

object linear モードは、テクスチャをオブジェクト座標系に対して固定した形式で適用します。オブジェクトが3Dシーンで回転や移動をした場合でも、テクスチャマッピングは同じ状態のままです。これとは対照的に、eye linear モードは、視点の座標系に対して固定した形式でテクスチャを適用します。オブジェクトが3Dシーンで回転や移動をした場合、オブジェクトに対するテクスチャの貼り付け方が変化します。最後に、sphere map モードは一般に環境マッピングと呼ばれる効果を生み出します。オブジェクトは周囲の環境を反射しているようにレンダリングされ、テクスチャは周囲の環境を球形マッピングされたイメージを含んでいると見なされます。オブジェクトが3Dシーンで回転や移動をした場合、オブジェクトに対するテクスチャの貼り付け方は変化します。

これらの絶対的なマッピングモードは、GLグループの tex_map ア トリビュートを設定することによって使用できます。tex_map の値 0 はデフォルトで、GLグループオブジェクトのテクスチャ形式をそのまま使います。tex_map の値 1ではOpenGLの object linear モードを、値2ではOpenGL の sphere map モードを、値 3ではOpenGLの eyelinear モードを使います。

tex_map $1というメッセージボックスに接続されたナンバーボックスを変更してみて下さい。マウスで四面体の位置を移動させたり、回転させたりして、様々なモードがテクスチャマッピングにどのように影響するかを見て下さい。


絶対的なマッピングモードの使用:object linear(左)、sphere map(中央)、eye linear(右)

OpenGLのマッピングモード object linear と eye linear には、テクスチャの貼り付け方に影響を与える追加のパラメタがあります。これらは、GLグループの tex_plane_stex_plane_t アトリビュートによって設定されます。これらのアトリビュートの値は、4次元の均一な座標における各ベクトルです。text_plane_s と、4次元の均一な座標上で与えられた点のスカラー積は、テクスチャイメージを貼り付けるための水平位置を決定します。text_plane_tと4次元の均一な座標上で与えられた点のスカラー積は、テクスチャイメージを貼り付けるための垂直位置を決定します。デフォルトでは、tex_plane_s(1. 0. 0. 0.) に、tex_plane_t(0. 1. 0. 0.) になっています。

tex_plane_stex_plane_t というアトリビュートがテクスチャマッピングにどう影響するのかについてのさらに詳しい説明は、このチュートリアルの範疇を超えてしまいます。しかし、それが興味深い効果を生み出すことができないという意味ではありません。興味があれば、OpenGLのRed Book(レッドブック)や Blue Book(ブルーブック)を参考にして下さい。

texture plane s texture plane t というラベルの下のそれぞれのナンバーボックスで試してみてください(なんらかの効果を得るためには、tex_map13 が設定されていなければなりません)。


追加のパラメータによる実験

まとめ

テクスチャの生成方法や、GLグループによって生成されたジオメトリに対してテクスチャを適用する様々な方法について説明してきました。jit.gl.render オブジェクトの texture メッセージを使って、名前を持ったテクスチャを生成し、サイズを設定し、画像やビデオのデータをコピーすることができます。GLグループの texture アトリビュートは、名前を持ったテクスチャのどれを使うかを指定し、GLグループの tex_map アトリビュートは、GLグループのオブジェクトが持つ元々のテクスチャマッピングモード、もしくは、3つの絶対的な OpenGL テクスチャマッピングモードである object linear、eye linear、sphere map のうちのどれを使うかを選択します。