这个题目一看就非常大气,所以我会把整个教程写成如下几个部分:
1. PsychToolBox窗口操作函数
2. PsychToolBox矩形操作函数
3. PsychToolBox图形绘制函数
4. PsychToolBox文本操作函数
5. PsychToolBox图像处理函数
6. PsychToolBox时间操作函数
7. PsychToolBox按键操作函数
8. PsychToolBox对话框类函数
9. PsychToolBox音频操作函数
10. PsychToolBox视频操作函数
1. PsychToolBox窗口操作函数
在我的整个成长过程中,有机会见证了微软的操作系统从DOS进化到Windows的整个过程。
DOS:
特点:
- Dos是一种磁盘操作系统(Disk Operating System),Dos系统必须用Dos语言才能实现对计算机的使用(即所有操作都需要命令)。
- 单任务单用户。每次只能执行一个程序。
- 界面是永远不变的文字交换(不可视化)。
- 响应速度快。
- Dos命令独一无二,如远程操作等高级操作都需要Dos命令。
Windows:
特点:
- Windows是图形界面操作系统(可视化)。
- 多任务多用户,可以同时执行多个程序。
- 操作简单,只需要用鼠标点击即可,不需要大量的命令。
- 多任务存在安全隐患。
早期Windows界面:
简单进化版界面:
继续进化版界面:
最后成长为Windows95界面:
字符界面向图形界面的演变得益于硬件技术的提升,主要是GPU的发展。这就牵扯到CPU和GPU的关系和区别。它们的关系如下图所示:
它们的区别,可以用一张对比图来表示:
具体的差别体现在下面这个表格中:
图形操作系统的发展把原来简单的、快速的字符应用程序带入到了丰富多彩的图形世界,但是,原来只要一个字节表示的字符现在就需要很多像素数据。为了加快图形的显示就需要更多的内存,工程师们通过图形协处理器来快速处理显示的图像。通过位转换器,不但可以实现内存的快速复制,而且还可以实现诸如缩放、拉伸和格式转换等许多复杂的功能。为了增加显示速度,计算机的显卡又增加了显示内存,现在的显卡,例如GTX1080,它的显存是8G。显存越高图形图像的显示就越流畅。而且在计算机硬件的架构上,采用了如下的结构来保证CPU快速访问显存内存。
这样显示系统就能够通过AGP结构实现对系统内存的快速访问,从而提高系统内存到显示内存到传输效率。
讲解这么多,是希望大家能稍微能更深入地理解PsychToolBox使用页面切换技术来提高实验程序的性能的内部机制:一类页面是可见的页面(窗口),我们又称之为主页面(OnScreen);另外一类页面是不可见的页面,我们又称之缓冲页面(OffScreen)。所有的绘制工作都是在缓冲页面上进行的,需要显示的时候,再把它们快速呈现在可见的主页面上。页面切换技术通过使应用程序在显示之前来绘制图形从而提高帧速率,获得快速流畅的图像显示效果。
当页面发生切换时,所交换的仅仅是内存数据,二其他与页面相关的属性仍然保持不变。例如,调色板,前景色与背景色和字体属性等。
PsychToolBox的整个页面创建,缓冲和显示技术都是围绕Screen函数进行的,一般的格式是Screen('函数字符串',参数列表)。其中'函数字符串'是文本型的函数名称,比如'OpenWindow','Flip',和'CloseAll'等,必须将这些函数名称置于单引号之内;二参数列表是供函数使用的参数,大多数参数都有默认值,除非有特殊要求,一般不需要设定,不需要设定的参数则置于[]内,必须指定参数值的参数则不放入括号内。例如:
[windowPtr,rect]=Screen('OpenWindow',windowPtrOrScreenNumber [,color] [,rect] [,pixelSize] [,numberOfBuffers] [,stereomode] [,multisample][,imagingmode]);
这里的屏幕windowPtrOrScreenNumber 是必须设置的参数,其他的像color和rect都不是必须设置的参数。
因为默认颜色是白色,默认窗口页面的大小为整个屏幕(与显示器的分辨率有关),等号前[]中的内容会接收函数执行后返回的指向页面的指针,也就是windowPtr,是返回的窗口句柄,供其他函数使用, rect是所创建的窗口的尺寸(窗口的left top right bottom),需要注意在书写参数时必须按照相应的顺序给出所需的参数,如果想省略某个参数值,可以使用门占位符来表示使用相应位置参数的默认值。
函数的参数包括:
(1) WindowPtrOrScreenNumber,窗口句柄或屏幕序号(支持多个显示器),序号0为覆盖两个显示器屏幕的页面(此时要注意两个显示器的分辨率要一致,否则可能会出现错误);序号1指第一个显示器,序号2指第二个显示器;后面放入1中的参数为可选参数,如果不指定,它们均使用相应的默认值。
(2) Color,窗口或屏幕颜色,默认值为白色,其值可为颜色对照表中的颜色索引值(0~255, 0为黑色,255为白色,中间值为不同灰度或[r g b]三原色向量值, r g b的取值范围为0~255,如[255,0,0]为红色, [0,255,0)为绿色,[0, 0, 255]为蓝色等。
(3) Rect,所创建的页面窗口的大小,默认值为整个屏幕大小(取决于显示器的分辨率),至少包含1个像素,如果在WindowPrOrScreenNumber参数中指定的是一个窗口句柄或屏幕序号,则rect中的坐标值是相对于该窗口或屏幕左上角的坐标而言,即以窗口或屏幕的左上角为原点。
(4) PixelSize,像素的深度,以位数来表示的存储一个像素所需的位数,默认值为当前显示器的设置,该值越高,表示某个像素的颜色值越丰富;可取值为8、16、32。
(5) NumberOfBuffers,缓冲区数, 般取值为2,我们可以将需要呈现的刺激,先写入缓冲区中,适当的时候再通过页面切换技术(Flip)将缓冲区中的内容一次性快速呈现在屏幕上,对于认知实验的视觉刺激呈现非常有益。
(6) Stereomode,是否立体模式,默认值为0,使用其他值时,可借助于立体设备(如i体眼镜CrystalEyes、红蓝立体眼镜)进行相应的立体视觉刺激的呈现; 1-使用OpenGL的立体输出,根据显示帧序号的奇偶决定左右眼的输出; 2-左视野呈现于屏幕上半部分,右视野呈现于屏幕下半部分;3-左视野呈现在下,右视野呈现在上; 4和5是将左右视野分别呈现屏幕的左右/右左; 6和7是以红、绿或绿、红呈现刺激; 8和9是以红、蓝或蓝、红呈现刺激: 10-将刺激分别呈现在所连接的两个显示器上: 11-与参数值1相同,但使用内置的函数,而非显示支持的本地函数。
注意:计算机的显卡不同,所支持的功能会有不同。
(7) Multisample,如果设置该参数为大于0的值,则表示系统会进行反锯齿优化,即呈现的刺激更平滑,但需要耗费较多的内存资源,同时可能会降低刷新频率。
(8) Imagingmode,图像处理模式,该参数用于控制是否使用PTB借助于OpenGL等插件所实现的图像处理功能。
(9) SpecialFlags,特殊标识,备用参数, 目前仅支持kPsychGUIWindow常量参数,使所创建的窗口行为更像Windows系统的图形用户界面。
(10) ClientRect用于指定绘制区域的大小,当使用该参数时,会建立相应的虚拟的帧缓冲,显示将该缓冲中的内容进行缩放处理,假设创建的窗口尺寸为300 ×200,如果设置clientRect为[0 0 150 100],会使绘制的内容在水平和垂直方向上放大两倍;如果设置该参数为[0 0 600 200],则使绘制的p容水平方向压缩为一半,垂直方向保持不变。
以上这些属于Psychtoolbox工具包的硬件和软件的背景知识,学习的过程中有点阅读词典的感觉,因为它本身就是学习参考手册,会显得有点枯燥无味。在实际的实验编程过程中,情况要简单很多,也就是将信息情景化,服务于具体的功能实现。一般实验编程遵循的是
“创建窗口” -->“绘制文本”-->“页面切换“
或者
“创建窗口” -->“创建纹理缓冲“-->“绘制图片”-->“页面切换“
这样两种顺序。
绘制文本的操作在之前的一个教程中有分享过:
蒋挺:Matlab+PsychToolBox=最好の心理学实验程序开发工具zhuanlan.zhihu.com我们现在简单演示一下如何在一个灰色背景的全屏幕页面窗口上绘制文本。
第一步,创建窗口:
wPtr=Screen ('Openwindow', 0,128);
如果要创建红色背景的大小为300 × 300像素的页面窗口,并且获取页面窗口指针,窗口
大小,但在实验程序最好不要创建此类区域窗口(听着挺矛盾的,其实真实的实验编程不涉及窗口,因为整个屏幕就是窗口 )
[WPtr, wRect]=screen ('Openwindow ',0, [255,0,0], [10, 10, 310, 310]) ;
还有是使用clientRect参数进行缩放操作,这个就更复杂了,考试肯定不会考这么细节的内容,但是你需要知道有这么一个功能,就算是Psychtoolbox在向你show它的肌肉吧(赐予我力量吧,我是马里奥开发的无敌的赛克图豹克斯!):
[windowPtr, rect] = screen ('Openwindow' ,0, 255, [00300 200] , [] ,[], [], [], [], [],[0 0 100 100]);
第二步,绘制文本:
Screen ('DrawText',windowPtr, 'How PTB',0, 0, [255 0 0]);
第三步,页面切换:
Screen ('FIip', windowPtr);
我们照着这个写一个简单的程序:
关闭页面:Close
Screen('Close',[windowOrTextureIndex or offscreenWindwIndices]);
关闭主页面wPtr
Screen('Close', wPtr);
这个文件底部的sca是缩写形式,它代表的含义是:
Screen('CloseAll');
如果要绘制图片,就要涉及矩形操作函数。
2.PsychToolBox矩形操作函数
通过这个工具我们可以画出很多不同的图形,比如点、线、举行、椭圆、多边形等。现在我们先来画一个矩形。
使用FrameRect函数画一个空心矩形:
Screen('FrameRect',windowPtr [,color] [,rect][,penWidth]);
首先我们来介绍一下参数:
(1)windowPtr,页面窗口指针,可以是主页面或者缓冲页面。
(2)color,矩形边框颜色,默认为黑色,0~255之间的灰度值,或者[r,g,b]形式的颜色三元组。
(3)rect,矩形大小,默认为整个窗口,形式为[x1,y1,x2,y2],表示矩形的左上角和右下角的坐标。
(4)penWidth,边框的粗细程度,以像素为单位,默认值为一个像素。
例如:画一个边框粗细为5像素的矩形
首先建立一个主页面,颜色为白色,以左上角为原点,窗口左上角的坐标为(50,50),右下角的坐标为(350,250)。因此,确定了窗口的大小。?
[wPtr, wRect]=Screen('OpenWindow',0,255,[50,50,350,250]);
接着我们画矩形,边框颜色为黑色,左上角坐标为(100,100),右下角的坐标为(300,200),边框粗细为5像素。
Screen('FrameRect',wPtr,0,[wRect(1)+50,wRect(2)+50,wRect(3)-50,wRect(4)-50],5);
% filename is:: ptb_showPicture_Berserker.m
% Clear the workspace and the screen
clearvars;
sca;
close all;
% 第二块 Here we call some default settings for setting up Psychtoolbox
PsychDefaultSetup(2);
% 第三块 Get the screen numbers. This gives us a number for each of the screens
% attached to our computer.
screens = Screen('Screens');
% 第四块 To draw we select the maximum of these numbers. So in a situation where we
% have two screens attached to our monitor we will draw to the external
% screen.
screenNumber = max(screens);
% 第五块 Define black and white (white will be 1 and black 0). This is because
% in general luminace values are defined between 0 and 1 with 255 steps in
% between. All values in Psychtoolbox are defined between 0 and 1
white = WhiteIndex(screenNumber);
black = BlackIndex(screenNumber);
% 第六块 Do a simply calculation to calculate the luminance value for grey. This
% will be half the luminace values for white
grey = white / 2;
% 第七块 Open an on screen window using PsychImaging and color it grey.
[window, windowRect] = PsychImaging('OpenWindow', screenNumber, grey);
% 第八块 Now we have drawn to the screen we wait for a keyboard button press (any
% key) to terminate the demo.
KbStrokeWait;
% 第九块 Clear the screen.
sca;