Screen('DrawTexture')
Screen('DrawTexture', windowPointer, texturePointer [,sourceRect] [,destinationRect] [,rotationAngle] [, filterMode] [, globalAlpha] [, modulateColor] [, textureShader] [, specialFlags] [, auxParameters]);
texturePointer で指定されたテクスチャ(いろんな図形)を windowPointer で指定されたウィンドウに描画します。(Mac) OS XのPTBでは、アニメーションのような速い画像描画を必要としている場合、オフスクリーンを使うよりもテクスチャを使うほうがよいでしょう。
sourceRect は描画するテクスチャの一部分だけを描画したいときに指定します。sourceRect を指定しない場合は、texturePointer で指定されるすべてのテクスチャを描画します。
destinationRect はウィンドウのどの位置に描画するかを指定します。デフォルトではスクリーン(ウィンドウ)の中心に描画します。
rotationAngle はテクスチャを回転して描画したいときに指定します。デフォルトでは0度になっていて、まっすぐの状態です。
filterMode はテクスチャを拡大、縮小またはシフトさせて描画するときに、どのようにpixel colorを計算するかを指定します。例えば、sourceRectとdestinationRectが同じサイズでないときや、sourceRectがfractional pixel valuesになっているときなどです。
filterMode の数字の意味は、0のときが Nearest neighbour filtering で 1のときが Bilinear filtering になります。1がデフォルトです。
以下のプログラムは、Screen('DrawTexture')の動作を学習するためのプログラムです。
以下のプログラムが理解できれば、Screen('DrawTexture')の仕組みの大部分を理解できたことになるでしょう。
Screen('MakeTexture')や解説3も参考にしてみてください。
function DrawTextureTest
ListenChar(2);
AssertOpenGL;
%手作りfunction
%myKeyCheck;
try
screenNumber=max(Screen('Screens'));
[expWin, rect]=Screen('OpenWindow', screenNumber, [255 255 255], [100, 200, 700, 600]);
%画面の中心座標
[mx, my]=RectCenter(rect);
%十字マークの行列(20×20)を作る
FixCr=ones(20,20)*255;
FixCr(10:11,:)=0;
FixCr(:,10:11)=0;
fixcross = Screen('MakeTexture',expWin,FixCr);
%以下の7行のいずれか1行のみを有効にして実行してみてください。
%Screen('DrawTexture', expWin, fixcross);
%Screen('DrawTexture', expWin, fixcross,[],[mx-10, my-10, mx+10, my+10]);
%Screen('DrawTexture', expWin, fixcross,[5, 5, 20, 20],[mx-10, my-10, mx+10, my+10]);
%Screen('DrawTexture', expWin, fixcross,[5, 5, 20, 20],[mx-50, my-50, mx+50, my+50]);
%Screen('DrawTexture', expWin, fixcross,[5, 5, 20, 20],[mx, my, mx+100, my+100]);
%Screen('DrawTexture', expWin, fixcross,[5, 5, 20, 20],[mx, my, mx+100, my+100], 30);
%Screen('DrawTexture', expWin, fixcross,[],[mx-50, my-50, mx+50, my+50], 45);
%画面に呈示
Screen('Flip', expWin);
%何かのキーを押すまで画面を閉じない
KbWait([], 3);
%終了処理
Screen('CloseAll');
ShowCursor;
ListenChar(0);
catch
Screen('CloseAll');
ShowCursor;
ListenChar(0);
end