查找此信息的位置是Shady.Stimulus
和的文档字符串Shady.Stimulus.LoadTexture
,以及包含的示例脚本animated-textures.py
。
像大多数 Python 一样,有多种方法可以做你想做的事。这是我的做法:
w = Shady.World()
s = w.Stimulus( [frame00, frame01, frame02, ...], multipage=True )
其中每个frameNN
都是 1000x1000 像素numpy
阵列(浮点或uint8
)。
或者,您可以要求 Shady 直接从磁盘加载:
s = w.Stimulus('trial01/*.png', multipage=True)
其中目录trial01
包含 25 个 1000x1000 像素的图像文件,命名为(比如说)00.png
,24.png
以便正确排序。或者您可以提供一个明确的文件名列表。
无论哪种方式,无论您是从内存还是从磁盘加载,帧都会在该调用中全部传输到显卡。然后,您可以(时间紧迫)在它们之间切换:
s.page = 0 # or any number up to 24 in your case
请注意,由于我们使用了该multipage
选项,我们使用“页面”动画机制(每帧创建一个 OpenGL 纹理)而不是默认的“帧”机制(创建一个 1000x25000 OpenGL 纹理),因为后者会超过许多显卡上单个纹理的最大允许尺寸。这些机制之间的区别在Shady.Stimulus
该类的文档字符串以及上述交互式演示中进行了讨论:
python -m Shady demo animated-textures
要准备下一次试用,您可以使用.LoadPages()
(Shady 版本 1.8.7 中的新功能)。这循环通过现有的“页面”将新纹理加载到先前使用的显卡纹理缓冲区中,并根据需要添加更多页面:
s.LoadPages('trial02/*.png')
现在,您提到您已建立的工作流程是将帧连接为单个 5000x5000 像素的图像。我上面的解决方案假设您已经完成了将其再次切割成 1000x1000 像素帧的工作,大概使用了 numpy 调用(听起来您现在可能正在 Matlab 中做同样的事情)。如果您要继续保存为 5000x5000,那么保持对事物控制的最佳方式可能确实是维护您自己的代码以进行切割。但值得一提的是,您可以采取完全不同的策略,一次将其全部转移:
s = w.Stimulus('trial01_5000x5000.png', size=1000)
这会将整个预先准备好的 5000x5000 图像从磁盘(或者从内存中,如果您想传递一个 5000x5000 numpy 数组而不是文件名)加载到显卡内存中的单个纹理中。但是,由于size
规范,Stimulus
将仅显示阵列的左下角 1000x1000 像素部分。然后,您可以通过相对于信封移动载体来切换“帧”。例如,如果您要说:
s.carrierTranslation = [-1000, -2000]
那么你会看到在你的 5x5 阵列中位于一个“列”和两个“行”上的框架。
最后一点,请记住,您可以利用 Shady 的即时伽马校正和抖动 - 除非您明确禁用它们,否则它们无论如何都会发生,当然,如果您将刺激.gamma
保持在 1.0 ,它们当然不会产生物理影响并使用整数像素值。因此,您可以将刺激生成为单独的 1000x1000 数组,每个数组都包含 range 中的非线性化浮点值[0.0,1.0]
,让 Shady 担心除此之外的所有内容。