在批处理模式下使用openGL渲染器时,所有文本都会丢失

时间:2012-02-18 01:23:36

标签: matlab opengl plot

在没有显示的情况下以批处理模式运行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

enter image description here


由于这些限制,我很高兴能找到大部分未记录的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

enter image description here

所以我想知道的是:如何让opengl渲染器以批处理模式处理文本?我有没有办法让文本与{一起工作? {1}}功能?也许是一种事先光栅化文本的方法?或者一种方法来组合文本的hardcopy()硬拷贝和情节的painters硬拷贝?或者,与opengl函数相比,是否存在完全不同的路径?另请注意,我的系统设置不太可能出现此问题,因为它在Mac OS和Ubuntu下都可以重现。

1 个答案:

答案 0 :(得分:8)

如果您使用的是Linux,则可以使用软件OpenGL渲染器(Matlab的现代版本捆绑了一个)。 对于Mac OS,此类选项不存在,至少不适用于当前的Matlab版本。 Windows很简单 - 即使批处理模式运行显示,所以你可以照常工作。

  1. 运行Xvfb :1 &,创建一个(虚拟)帧缓冲X服务器。
  2. 在一些文件中准备您的代码,比如bla.m

    opengl software;
    peaks
    alpha(0.5);
    print -dpng -opengl peaks_opengl.png
    exit
    

    如你所想,不要忘记opengl software非常重要。

  3. 运行以下命令:

    cat bla.m | matlab -display :1 -logfile log.txt
    

    使Matlab在虚拟显示器上执行bla.m中的任何内容,并将Matlab输出写入log.txt。当一切似乎都有效时,您可以删除日志文件。另请注意,:display :1必须符合您在Xvfb调用中提供的数字。

  4. 利润。