Screen('LoadNormalizedGammaTable')

[oldtable, success] = Screen('LoadNormalizedGammaTable', windowPtrOrScreenNumber, table [, loadOnNextFlip][, physicalDisplay][, ignoreErrors]);

'windowPtrOrScreenNumber'で指定されたスクリーン(またはウィンドウ)のガンマテーブルを読み込みます。新しいハードウェアガンマテーブルは、引数'table' で指定され、'nrows' 行と3列の行列で構成されています。それぞれの行はフレームバッファー内の単一の色を表しており、RGBの値を含んでいます。1列目が赤、2列目が緑、3列目が青の値となります。またそれぞれの値は、0.0(黒)から1.0(白。最も明るい輝度)の間でなければなりません。

例えば、table(127,1)=0.67 (行列tableの127行目の1列目の値が0.67)というのは、赤の値が127で指定されたときに、赤の最大値の67%で出力することを意味しています。同様に、table(32, 3)=0.11 は、青の値が32で指定されたときに、青の最大値の11%で出力することを意味しています。0.0から1.0の範囲は、一般的には8ビットから10ビットのデジタルアナログ変換器で到達できる精度を持つハードウェアに割り当てられます?(訳注 この文ちょっと自信がありません)

tableの行数 'nrows' は一般的には256です。

Mac OS Xであれば、256以外にも、512, 1024, 2048, ..., 65535 などを指定することができます。ただしこれは、Bits++を使うような特殊な環境下でのみ意味を持ちます。

Linux/X11をNVidia QuadroFX のようなプロ仕様のビデオカードとともに使用している場合には、256よりも大きな値を指定することができます。

もし'ScreenNumber' を使ってオンスクリーンウィンドウを指定していて、かつ、オプションのフラグである 'loadOnNextFlip' を 1 に設定しているときには、ガンマテーブルの更新はすぐに行われず、次のFlipコマンドが実行されたときとなります。こうすることで、視覚刺激とガンマテーブルの両方の変更を垂直同期させることができます。もしフラグの値をデフォルトのゼロに設定していると、次の垂直同期のタイミングで(もしくはビデオカードが垂直同期に同期するのをサポートしていない場合は直ちに)ガンマテーブルの更新が行われます。'loadOnNextFlip' が2に設定されているときは、ビデオカードのハードウェアテーブルを変更するのではなく、例えば Bits++ ボックスのような特殊な機器のハードウェアテーブルを変更します。これはカラールックアップテーブルを使ったアニメーションを呈示する場合にも利用できます。詳細は、'help PsychImaging'の中の 'EnableCLUTMapping' の項目をご覧ください。

Mac OS X では、'physicalDisplay' を1に設定することもできます(デフォルトはゼロ)。この場合には、 'windowPtrOrScreenNumber' によって、ウィンドウインデックスではなく実在するスクリーンナンバーを指定する必要があります。そして、論理デバイスの代わりに、物理的に存在しているディスプレイデバイスが選択されます。これはどういったケースで利用できるかというと、ミラーリング(クローン)でマルチディスプレイを実現していて、それぞれで異なったガンマテーブルを割り当てる場合です。なぜなら、このようなケースでは論理デバイスとしては1つになりますが、物理的には複数のディスプレイが存在しているからです。物理的なディスプレイと、論理ディスプレイとでは、スクリーンナンバーが異なることに注意して下さい。

Screen('Screens', 1);

を実行することで、物理ディスプレイのリストを表示させることができます。

GNU/Linux X11においては、'physicalDisplay' によって、マルチディスプレイ環境下でどのビデオ出力にガンマテーブルを適用するかを選択することができます。Linux/X11においては、ひとつのスクリーンから複数のビデオを出力させることができるため、この引数によってそれぞれのディスプレイに対して個別のガンマテーブルを適用させることができます。デフォルトではマイナス1になっています。これはつまり、与えられたスクリーンのすべての出力に対して同じガンマテーブルを適用させるという意味です。

'ignoreErrors' を1に設定すると、仮にOSがガンマテーブルのアップデートを拒否した場合でも、スクリプトを強制終了させることなく継続しようとします(ただし、'loadOnNextFlip' を 0に設定してすぐにガンマテーブルのアップデートを適用しようとしている場合に限る)。2番目の戻り値である 'success' は成功すると1に、失敗するとゼロになります。もし 'loadOnNextFlip' に0よりも大きな値が設定されて、ガンマテーブルのアップデートがすぐに行われない場合には、'ignoreErrors' は機能しません。

OSX と Linux/X11においては、この関数は任意のガンマテーブルを受け取ることができ、それによってCLUTアニメーションが機能することになりますが、本来はこのようなCLUTアニメーションは避けるべきです。その代わりに、PsychImaging(...'EnableCLUTMapping'...) 関数を使用して下さい。CLUTアニメーションは最近では誤ったやり方であるとみなされています。どうしても必要な場合は、PsychImaging() の関数が、プラットフォームに依存しない、かつ信頼性のある時間制御を実現します。

Windowsにおいては、単調に増加する値で構成されたガンマテーブルだけが適切だと見なされます。それ以外のテーブルはOSによって拒否されます。従ってCLUTアニメーションには利用できず、ディスプレイのlinearizing または calibrating にのみ活用できます。その他にもWindowsは未知の制約を設けているので、普通のガンマテーブル以外を使用するのはトラブルの元になります。同様のことは、WaylandのディスプレイサーバーをLinuxで使用している場合にも生じます。

なお、1番目の戻り値に、古いガンマテーブルの情報が入っています。