在没有显示的情况下以批处理模式运行 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
渲染器以批处理模式处理文本?有没有办法让文本工作使用 hardcopy()
函数?也许是一种预先栅格化文本的方法?或者将文本的 painters
硬拷贝和情节的 opengl
硬拷贝结合起来的方法?或者,是否有与 hardcopy()
函数完全不同的途径来完成这项工作?另请注意,问题不太可能出在我的系统设置上,因为它在 Mac OS 和 Ubuntu 下都可以重现。
最佳答案
如果您使用的是 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软件
。运行以下命令:
cat bla.m | matlab -display :1 -logfile log.txt
这使得
Matlab
在虚拟显示器上执行bla.m
中的任何内容,并将Matlab
输出的任何内容写入log。文本文件
。当一切似乎都正常时,您可以删除日志文件。另外,请注意:display :1
必须符合您在Xvfb
调用中提供的数字。利润。
关于matlab - 在批处理模式下使用 openGL 渲染器时所有文本都丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9337662/