チュートリアル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面体を回転させるためにマウスを使ってみてください。

こうすることによって、実際にそれが3次元の形状だということがわかりますが、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オブジェクトのテクスチャアトリビュートを設定し、描画時に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.moviejit.matrixオブジェクトにイメージやムービーをロードし、texture [texture-name] jit_matrix [matrix-name]のメッセージをjit.gl.renderオブジェクトに送ることで可能になります。もし、[texture-name]によって指定されたテクスチャが既にあれば、送られてきたマトリクスは現在のテクスチャの大きさに再度サンプリングされます。もし、その名前のテクスチャがなければ、新しいテクスチャが生成されます。その大きさは、そのJitterマトリクスと同じかそれ以上で最も近い2の累乗になります。

・パッチのTexturesというラベルが付いた部分にあるtexture picture 128 128というメッセージボックスをクリックしてください。これはpictureという名前の128×128のテクスチャを生成し、これまでと同じようにデフォルトの白とグレイのチェックのパターンで塗り潰します。

jit.qt.movieオブジェクトにcolorbars.pictイメージをロードし、それをpictureという名前のテクスチャに上記の方法で送るために、read colorbars.pict, bangというメッセージボックスをクリックしてください。

まだ何の結果も見えないでしょう。なぜなら、jit.gl.platoオブジェクトにはgridという名前のテクスチャがまだ使われているからです。

・パッチのPlatonic Solidというラベルが付いた部分にあるtexture pictureというメッセージボックスをクリックしてください。

これで、やっと4面体の周りを覆うカラーバーのイメージが見えるはずです。


テクスチャとしてのイメージの使用


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

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

・pictureという名前のテクスチャにビデオのコピーを開始するため、metroオブジェクトに繋がっているtoggleオブジェクトをクリックしてください。


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


補間とテクスチャサイズ

デフォルトでは、テクスチャ補間がオンになっているため、テクスチャのピクセル間にあるスクリーンピクセルは、テクスチャイメージ内の近くの値で補間した値が使われるでしょう。これによって、テクスチャがぼやけたり、伸びたりする影響があります。補間なしでテクスチャを貼り付けるためには、jit.gl.renderオブジェクトのinterpメッセージを使って補間をオフに切り替えることができます。このメッセージは jit.gl.renderオブジェクトの現在のテクスチャだけに影響するので、interpメッセージを送る前に現在のテクスチャを[texture-name]アーギュメントで指定されたものにするため、usetexture [texture-name] メッセージを送ることができます。

jit.gl.renderオブジェクトがpictureという名前のテクスチャを使うようにするため、usetexture picture, interp $1というメッセージボックスに繋がったtoggleボックスをクリックしてください。そして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モードを使います。tex_map値の2は、OpenGLのsphere mapモードを使います。tex_map値の3は、OpenGLのeye linearモードを使います。

・tex_map $1というメッセージボックスに繋がっているナンバーボックスを変えてみてください。マウスで四面体の位置を動かしたり回転させたりして、様々なモードがテクスチャマッピングにどう作用するのかを見てください。


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

OpenGLのobject linearとeye linearマッピングモードには、テクスチャの貼り付け方法に影響する付加的なパラメタがあります。それらは、GLグループのtex_plane_sとtex_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_sとtex_plane_tアトリビュートがテクスチャマッピングにどう影響するのかについてのさらに詳しい説明は、このチュートリアルの範疇ではありません。しかし、それは興味深い効果を生み出すことができない意味ではありません。興味があれば、OpenGLのレッドブックやブルーブックを調べてみてください。

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


付加的なパラメータによる実験


まとめ

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