OpenGL関数で二次元図形を描く
最初に、MinimalisticOpenGLDemo を見たことがない方は、先にそちらをご覧ください。
ここでは、GLUTによる「手抜き」OpenGL入門「二次元図形を描く」で解説されている内容をPTBのプログラムの中で行う方法について解説します。またPTBとどのように連動させるのかに重きを置いているので、OpenGLに関する詳細な説明はリンク元をご覧ください。
線を引く
clear all;
AssertOpenGL;
ListenChar(2);
bgColor = [128 128 128]; % 背景色
screenWidth = 500; % OpenGLで描画する領域(正方形)の幅。
screenNumber=max(Screen('Screens'));
InitializeMatlabOpenGL;
try
[windowPtr, windowRect] = Screen('OpenWindow', screenNumber, bgColor);
% OpenGL関数で描画する領域
myRect = CenterRectOnPoint([0 0 screenWidth screenWidth], windowRect(3)/2, windowRect(4)/2);
% OpenGL関数を使い始めるという宣言
Screen('BeginOpenGL', windowPtr);
% PTBの座標系では画面の左上が原点だが、OpenGLでは画面の左下が原点であることに注意。
glViewport(myRect(1), myRect(2), screenWidth, screenWidth);
glMatrixMode(GL.PROJECTION); % アンダーバーがドットになっていることに注意。
glLoadIdentity;
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glClearColor(0,0,0,0);
glClear;
glBegin(GL.LINE_LOOP); % アンダーバーがドットになっていることに注意。ただし、LINEとLOOPのあだいはアンダーバー。
glVertex2d(-0.9, -0.9);
glVertex2d(0.9, -0.9);
glVertex2d(0.9, 0.9);
glVertex2d(-0.9, 0.9);
glEnd();
% OpenGL関数の使用を終わります。
Screen('EndOpenGL', windowPtr);
% この段階で、PTBの機能を使って図形を描画することも可能です。
Screen('FillRect', windowPtr, [255 0 0], [200 300 400 400]);
Screen('Flip', windowPtr);
KbWait;
Screen('CloseAll');
ShowCursor;
ListenChar(0);
catch
Screen('CloseAll');
ShowCursor;
ListenChar(0);
psychrethrow(psychlasterror);
end
線に色をつける
clear all;
AssertOpenGL;
ListenChar(2);
bgColor = [128 128 128]; % 背景色
screenWidth = 500; % OpenGLで描画する領域(正方形)の幅。
screenNumber=max(Screen('Screens'));
InitializeMatlabOpenGL;
try
[windowPtr, windowRect] = Screen('OpenWindow', screenNumber, bgColor);
% OpenGL関数で描画する領域
myRect = CenterRectOnPoint([0 0 screenWidth screenWidth], windowRect(3)/2, windowRect(4)/2);
% OpenGL関数を使い始めるという宣言
Screen('BeginOpenGL', windowPtr);
% PTBの座標系では画面の左上が原点だが、OpenGLでは画面の左下が原点であることに注意。
glViewport(myRect(1), myRect(2), screenWidth, screenWidth);
glMatrixMode(GL.PROJECTION);
glLoadIdentity;
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glClearColor(0,0,0,0);
glClear;
glColor3d(1.0, 0.0, 0.0);
glBegin(GL.LINE_LOOP);
glVertex2d(-0.9, -0.9);
glVertex2d(0.9, -0.9);
glVertex2d(0.9, 0.9);
glVertex2d(-0.9, 0.9);
glEnd();
% OpenGL関数の使用を終わります。
Screen('EndOpenGL', windowPtr);
% この段階で、PTBの機能を使って図形を描画することも可能です。
Screen('FillRect', windowPtr, [255 0 0], [200 300 400 400]);
Screen('Flip', windowPtr);
KbWait;
Screen('CloseAll');
ShowCursor;
ListenChar(0);
catch
Screen('CloseAll');
ShowCursor;
ListenChar(0);
psychrethrow(psychlasterror);
end
図形を塗りつぶす1(べた塗り)
clear all;
AssertOpenGL;
ListenChar(2);
bgColor = [128 128 128]; % 背景色
screenWidth = 500; % OpenGLで描画する領域(正方形)の幅。
screenNumber=max(Screen('Screens'));
InitializeMatlabOpenGL;
try
[windowPtr, windowRect] = Screen('OpenWindow', screenNumber, bgColor);
% OpenGL関数で描画する領域
myRect = CenterRectOnPoint([0 0 screenWidth screenWidth], windowRect(3)/2, windowRect(4)/2);
% OpenGL関数を使い始めるという宣言
Screen('BeginOpenGL', windowPtr);
% PTBの座標系では画面の左上が原点だが、OpenGLでは画面の左下が原点であることに注意。
glViewport(myRect(1), myRect(2), screenWidth, screenWidth);
glMatrixMode(GL.PROJECTION);
glLoadIdentity;
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glClearColor(1,1,1,1);
glClear;
glColor3d(1.0, 0.0, 0.0);
glBegin(GL.POLYGON);
glVertex2d(-0.9, -0.9);
glVertex2d(0.9, -0.9);
glVertex2d(0.9, 0.9);
glVertex2d(-0.9, 0.9);
glEnd();
% OpenGL関数の使用を終わります。
Screen('EndOpenGL', windowPtr);
% この段階で、PTBの機能を使って図形を描画することも可能です。
Screen('FillRect', windowPtr, [255 0 0], [200 300 400 400]);
Screen('Flip', windowPtr);
KbWait;
Screen('CloseAll');
ShowCursor;
ListenChar(0);
catch
Screen('CloseAll');
ShowCursor;
ListenChar(0);
psychrethrow(psychlasterror);
end
図形を塗りつぶす2(頂点ごとに色を変える)
clear all;
AssertOpenGL;
ListenChar(2);
bgColor = [128 128 128]; % 背景色
screenWidth = 500; % OpenGLで描画する領域(正方形)の幅。
screenNumber=max(Screen('Screens'));
InitializeMatlabOpenGL;
try
[windowPtr, windowRect] = Screen('OpenWindow', screenNumber, bgColor);
% OpenGL関数で描画する領域
myRect = CenterRectOnPoint([0 0 screenWidth screenWidth], windowRect(3)/2, windowRect(4)/2);
% OpenGL関数を使い始めるという宣言
Screen('BeginOpenGL', windowPtr);
% PTBの座標系では画面の左上が原点だが、OpenGLでは画面の左下が原点であることに注意。
glViewport(myRect(1), myRect(2), screenWidth, screenWidth);
glMatrixMode(GL.PROJECTION);
glLoadIdentity;
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glClearColor(1,1,1,1);
glClear;
glBegin(GL.POLYGON);
glColor3d(1.0, 0.0, 0.0); % 赤
glVertex2d(-0.9, -0.9);
glColor3d(0.0, 1.0, 0.0); % 緑
glVertex2d(0.9, -0.9);
glColor3d(0.0, 0.0, 1.0); % 青
glVertex2d(0.9, 0.9);
glColor3ub(255, 255, 0); % 黄色(0から255の値で指定したいときは、glColor3ubを使います)
glVertex2d(-0.9, 0.9);
glEnd();
% OpenGL関数の使用を終わります。
Screen('EndOpenGL', windowPtr);
% この段階で、PTBの機能を使って図形を描画することも可能です。
Screen('FillRect', windowPtr, [255 0 0], [200 300 400 400]);
Screen('Flip', windowPtr);
KbWait;
Screen('CloseAll');
ShowCursor;
ListenChar(0);
catch
Screen('CloseAll');
ShowCursor;
ListenChar(0);
psychrethrow(psychlasterror);
end