在没有显示的情况下以批处理模式运行MATLAB(例如,未设置$DISPLAY
UNIX环境变量,或启动时使用matlab -nodisplay
标志),通常您无法使用opengl
渲染器。相反,你必须选择painters
渲染器。例如:
>> print -dpng -opengl fig.png
Warning: OpenGL mode can not be used in terminal emulation mode; ignoring option.
不幸的是,painters
在使用补丁,灯光,透明度等3D场景时经常效果不佳。这是一个简单的例子(现在使用显示),其中alpha丢失:
peaks
alpha(0.5)
print -dpng -opengl peaks_opengl.png
print -dpng -painters peaks_painters.png
由于这些限制,我很高兴能找到大部分未记录的hardcopy()
内置MATLAB函数, 以某种方式让您使用opengl
渲染器一个显示器。这个函数是很棒的export_fig()
函数的基础。现在,我能够以批处理模式快速保存高质量的3D数字。
但是,有一个问题:当图形通过hardcopy()
函数时,所有文本都会丢失。例如:
plot(1,1)
title('TEST')
>> A = hardcopy(gcf, '-Dopengl', '-r300');
Warning: Failed to draw text string
> In /Applications/MATLAB_R2010b.app/toolbox/matlab/graphics/hardcopy.p>hardcopy at 21
输出数字完全没有任何文本(没有轴标记标签,没有标题):
export_fig axis.png -opengl
所以我想知道的是:如何让opengl
渲染器以批处理模式处理文本?我有没有办法让文本与{一起工作? {1}}功能?也许是一种事先光栅化文本的方法?或者一种方法来组合文本的hardcopy()
硬拷贝和情节的painters
硬拷贝?或者,与opengl
函数相比,是否存在完全不同的路径?另请注意,我的系统设置不太可能出现此问题,因为它在Mac OS和Ubuntu下都可以重现。
答案 0 :(得分:8)
如果您使用的是Linux,则可以使用软件OpenGL渲染器(Matlab
的现代版本捆绑了一个)。
对于Mac OS,此类选项不存在,至少不适用于当前的Matlab
版本。
Windows很简单 - 即使批处理模式运行显示,所以你可以照常工作。
Xvfb :1 &
,创建一个(虚拟)帧缓冲X服务器。在一些文件中准备您的代码,比如bla.m
:
opengl software;
peaks
alpha(0.5);
print -dpng -opengl peaks_opengl.png
exit
如你所想,不要忘记opengl software
非常重要。
运行以下命令:
cat bla.m | matlab -display :1 -logfile log.txt
使Matlab
在虚拟显示器上执行bla.m
中的任何内容,并将Matlab
输出写入log.txt
。当一切似乎都有效时,您可以删除日志文件。另请注意,:display :1
必须符合您在Xvfb
调用中提供的数字。
利润。