Screen('BlendFunction')
[sourceFactorOld, destinationFactorOld, colorMaskOld]=Screen('BlendFunction', windowIndex, [sourceFactorNew], [destinationFactorNew], [colorMaskNew]);
windowIndexで指定されるウィンドウの、現在のアルファブレンディングモードとthe color buffer writemask(後述)を変更する。
アルファブレンディングとは、あるウィンドウの各点(ピクセル)において、現在の色と描画コマンドによって新しく描画されようとしている色とを混ぜ合わせる方法である。アルファブレンディングは、デフォルトでは無効になっている。アルファブレンディングが無効のときに、例えば座標が (x, y)のピクセルを新しい色 [Rs Gs Bs As] で上書きすると、(x, y)の色は単純に [Rs Gs Bs As] に変わる。しかしながら、OpenGLを使うと、(x, y)の現在の色と新しい色とを混ぜ合わせることができる(これがアルファブレンディングである)。現在の色は(描画先の色ということで)destination colorsと呼ばれる。ここでは [Rd Gd Bd Ad] としてそれを表す。
アルファブレンディング後の座標(x,y)の色を [Rn Gn Bn An] とすると、次の式のように表せる。
[Rn Gn Bn An] = blendequation([Rs Gs Bs As], [Rd Gd Bd Ad]);
ここでblendequationとは、どのように [Rs Gs Bs As] と [Rd Gd Bd Ad] を混ぜ合わせるかを決める関数である。blendequationは、引数'sourceFactorNew' と 'destinationFactorNew' によって決められる。help PsychAlphaBlending を参照のこと。デフォルトでは、sourceFactorNew=GL_ONE、destinationFactorNew=GL_ZEROとなっており、アルファブレンディングは無効になっている。
最も一般的なアルファブレンディングは、
sourceFactorNew = GL_SRC_ALPHA
destinationFactorNew = GL_ONE_MINUS_SRC_ALPHA
の組み合わせである。
これらの引数の組み合わせは、Screen('DrawLines')コマンドやScreen('DrawDots')コマンドによってアンチエイリアシング(スムージング)された刺激や、Screen('DrawTexture')コマンドでマスクされた刺激を描画する場合に必要となる。
次のデモを参考にしてほしい。
DotDemo, LinesDemo, AlphaImageDemo, GazeContingentDemo
Screen('BlendFunction')関数は、ウィンドウのthe color write maskの変更もできる。カラーチャンネルを無効にすることで、PTBが、ひとつまたは複数のカラーチャンネルの中身を書き変えることを防ぐことができる。例えば、描画コマンドが赤チャンネルだけに影響を与えるようにすることができる(青、緑、アルファの各チャンネルには影響を与えない)。
チャンネルの選択には、引数colorMaskNew(ベクトル)を用いる。colorMaskNewの1番目の要素は、赤チャンネルに関するもので、0より大きな値であれば赤チャンネルへの書き込みを許可するし、0であれば許可しない。同様に2番目の要素は緑チャンネルを、3番目の要素は青チャンネルを、4番目の要素はアルファチャンネルに対応している。
例えば、colorMaskNew = [1 1 0 0] であれば、赤と緑チャンネルの更新は許可するが、青とアルファチャンネルについては許可しない。colorMaskNew = [0 1 0 1] であれば、緑とアルファチャンネルの更新は許可するが、赤と青チャンネルについては許可しない。デフォルトではすべてのチャンネルが許可されている。
アルファブレンディングと、color write maskの設定は、ウィンドウごとに行われる。つまり、オンスクリーンウィンドウ、オフスクリーンウィンドウ、テクスチャなどのそれぞれで、別々の値をセットすることができる。