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

Joh*_*lby 7 opengl matlab plot

在没有显示的情况下以批处理模式运行MATLAB(例如,未设置$DISPLAYUNIX环境变量,或matlab -nodisplay启动时使用标志),通常不能使用opengl渲染器.相反,你必须满足于painters渲染器.例如:

>> print -dpng -opengl fig.png
Warning: OpenGL mode can not be used in terminal emulation mode; ignoring option. 
Run Code Online (Sandbox Code Playgroud)

不幸的是,painters在处理具有补丁,光照,透明度等的3D场景时,往往效果不佳.这是一个简单的例子(现在使用显示),其中alpha丢失:

peaks
alpha(0.5)
print -dpng -opengl peaks_opengl.png
print -dpng -painters peaks_painters.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


由于这些限制,我感到非常兴奋的发现大多-无证hardcopy()内置MATLAB函数,它以某种方式让你使用opengl渲染器没有显示.这个功能是很棒的export_fig()功能的基础.现在,我能够以批处理模式快速保存高质量的3D数字.

但是,有一个问题:当图形通过hardcopy()函数时,所有文本都会丢失.例如:

plot(1,1)
title('TEST')
Run Code Online (Sandbox Code Playgroud)
>> A = hardcopy(gcf, '-Dopengl', '-r300');
Warning: Failed to draw text string
> In /Applications/MATLAB_R2010b.app/toolbox/matlab/graphics/hardcopy.p>hardcopy at 21
Run Code Online (Sandbox Code Playgroud)

输出数字完全没有任何文本(没有轴标记标签,没有标题):

export_fig axis.png -opengl
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

use*_*136 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
    
    Run Code Online (Sandbox Code Playgroud)

    opengl software正如你想象的那样,不要忘记这一点非常重要.

  3. 运行以下命令:

    cat bla.m | matlab -display :1 -logfile log.txt
    
    Run Code Online (Sandbox Code Playgroud)

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

  4. 利润.