Screen('MakeTexture')

textureIndex=Screen('MakeTexture', WindowIndex, imageMatrix [, optimizeForDrawAngle=0] [, specialFlags=0] [, floatprecision=0] [, textureOrientation=0] [, textureShader=0]);

2次元または3次元の行列であるimageMatrixをOpenGLで扱えるテクスチャに変換し、DrawTextureに渡すためのインデックスを返します。OpenGLでは、アニメーションのように素早い画像の描画を行うため、オフスクリーンからテクスチャを使用するようになりました。

imageMatrixはモノクロ(輝度)情報のみか、LA(Luminance & alpha ? 輝度と透明度?)情報か、RGB情報か、RGBA情報で構成されます。Aはアルファと呼ばれ、ピクセルの透明度を表します。アルファ値は、0から255の値をとり、0のときが完全に透明、255のときが完全に不透明を意味します。

Screen('ColorRange') コマンドは、'floatprecision'(詳細は後述)と同様に、倍精度(double)のimageMatrixの値の範囲に影響を及ぼします。

アルファ値が透明度として機能するには、Screen('BlendFunction',...) を呼び出してアルファブレンディングを有効にする必要があります。

'optimizeForDrawAngle' 引数が与えられると、PTBはある回転角度における描画が高速になるよう、テクスチャを最適化します。デフォルトの値は0で、垂直方向の描画に最適化されます。

'specialFlags'が1のときで、imageMatrixの幅と高さが2の累乗(例えば、64 x 64, 256 x 256, 512 x 512など)の場合、もしくはグラフィクスカードがnon-power-of-two textures をサポートしている場合は、GL_TEXTURE_2D の型のOpenGLテクスチャーが作られます。それ以外の場合には、PTBは、高速描画と低メモリ消費が少なくなるよう、最適なフォーマットを選択します。

GL_TEXTURE_2D は、ドリフトするグレーティング刺激の描画(アニメーション)を行う場合や、OpenGL 3D graphics functionsを併用する場合、blurringなどに特に有用です。ただし現時点では、'specialFlags'が2または4のときに自動的にcompatibleにはならないので注意が必要です。

'specialFlags'が2のときは、PTBは、ハードウェアに組み込まれた方法を用いる代わりに、独自の高質テクスチャフィルタリングアルゴリズムを用いてbilinearly filtered texturesを描画します。これらの動作は、fragment shaderをサポートした最新のハードウェアでしか動作せず、ハードウェアに組み込まれたフィルタリングを使う場合よりも低速です。しかし、いくつかのハードウェアにおいては高精度の動作を可能にすることもあるでしょう。

PTBは、浮動小数点のテクスチャ(floating point textures)を扱うとき(訳注:おそらく0から255の値で色を指定するのではなく、0.0から1.0の範囲で指定する場合)や、unclamped color processing を有効にするためにScreen('ColorRange') を使用するときには、自動的に独自のフィルタアルゴリズムを有効にします。その場合、PTBは、現在使用しているハードウェアが、制約のない高精度の色処理を行うことができるかをチェックします。もしハードウェアが対応していない場合は、処理速度が遅くなりますが、PTBは高精度を実現するために独自のshader-based な次善策を有効にします。

'specialFlags' が 4 のときは、PTBは特に高速にテクスチャーを作成することを試みます。この方法は、いくつかのシステムにおいては、少なくともan order of magnitude faster です。しかし、この方法は最新のGPUでのみ機能し、ある上限の画像サイズのみに機能し、いくつかの制約、例えば、スクロールするテクスチャーまたは高精度のフィルタリングがまったく機能しなくなったりします。

あなたにとっての利用価値は変わりうるので、このフラグはさらなるスピードを求めるとき、そして刺激が正しく表示されていることを確認した上で使用するようにしてください。

imread 関数で読み込んだ画像のように、uint8のデータを読み込むときに最もスピードが上がることが期待できますが、8ビットの整数で表現された輝度+アルファにおいても、倍精度のフォーマットからなるRGBテクスチャーにおいても利用できます。

'specialFlags' が 8 のときは、GL_TEXTURE_2Dのための自動的なmipmap-generationを防ぎます。

'specialFlags' が 32 のときは、Screen('Close');コマンドによって自動的にテクスチャーが閉じられるのを防ぎます。テクスチャーを閉じるときは、Screen('Close', textureIndex); コマンドを使ってください。

'floatprecision'は、テクスチャーがどのように保存され処理されるかに関わる精度を決定します。デフォルトはゼロで、各色ごとに8ビットのテクスチャーが保存されます。これはimread関数で読み込まれた標準的な画像データで使われる形式です。

ゼロ以外の数値が与えられたときは、浮動小数点(訳注:0.0から1.0)でテクスチャーを表現します。これによって、複雑なブレンディング操作や計算が可能となり、tone-mapping を適用したLDRディスプレイやHDRディスプレイにおいて、high dynamic range image textures の処理や表示をする場合に利用できます。

'floatprecision'が1のときは、テクスチャーは各色ごとにhalf_float format, すなわち16ビットで保存されます。これはほとんどの画像表示において適しており、最近のグラフィクスカードでは高速に動作します。

'floatprecision'が2のときは、各色ごとに32ビットの単精度を実現します。複雑な計算や画像処理に効果がありますが、2007年以前に作られたグラフィクスカードのいくつかにおいては、テクスチャーのフィルタリングを行う際に処理速度がかなり遅くなります。'floatprecision'が1のときは、16ビットの浮動小数点の精度のテクスチャーとなりますが、もしグラフィクスカードがサポートをしていないときは、代わりにPTBは15ビットの精度(符号あり整数)を採用します。このようなテクスチャーは、変更前の16ビットよりも精度がよくなります。ただし、-1.0から+1.0を超える範囲の値を取り扱うことはできません。OpenGL-ESハードウェアにおいては、32ビットのテクスチャーが選択されます。

'textureOrientation' はテクスチャーに、特別な orientationを付与します。

普通(0の値)は、Matlabの行列は、標準的なMatlab column-major dataformat で受け渡しがされます。

これは、Screen('TransformTexture')によって処理される場合を除いて効果があります。従って、必要に応じてテクスチャーを変換する必要があります。このフラグを使うと、処理のショートカットになります。

1に設定したとき、最適なフォーマットに直ちに変換されます。

2に設定したとき、Matlabの行列はすでに最適なフォーマットに変換されたものとみなされ、それ以上の処理がなされません。

3に設定したとき、テクスチャーは完全に等方性(isotropic)であるとみなされ、(特定の方位を持たない?)まったく変換されません。これはランダムノイズのテクスチャーや、例えばsome power spectrum distribution(フーリエ変換後のスペクトラム?) のように相関のないノイズのようなピクセルデータに対してのみ意味があります。

'textureShader' もし、OpenGL GLSLシェイダープログラムのハンドルが与えられたときは、Screen('DrawTexture',...) コマンドによってテクスチャーを描画する際に、そのシェイダープログラムが実行されます。つまり、標準のテクスチャー描画の操作をカスタマイズすることができます。

これは次の2つの理由で有効です。

a) テクスチャーにおける画像処理をその時々に応じて行わなければならない

b) 手続き型のシェーディングが必要とされている

つまり、画像をあらかじめエンコードすることができず、描画の際に計算を必要とする場合です。例えば、ガボールパッチを画像として定義する代わりに、描画時に計算されるよう、計算式を定義することができます。

Screen('SetOpenGLTexture') コマンドを使うことで、このようなシェイダーによって構成される、仮想的なテクスチャーを作成することができます。このテクスチャーにはリアルなデータは保存されておらず、その時々に応じて作成されることになります。