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

标签 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 渲染器以批处理模式处理文本?有没有办法让文本工作使用 hardcopy() 函数?也许是一种预先栅格化文本的方法?或者将文本的 painters 硬拷贝和情节的 opengl 硬拷贝结合起来的方法?或者,是否有与 hardcopy() 函数完全不同的途径来完成这项工作?另请注意,问题不太可能出在我的系统设置上,因为它在 Mac OS 和 Ubuntu 下都可以重现。

最佳答案

如果您使用的是 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软件

  3. 运行以下命令:

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

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

  4. 利润。

关于matlab - 在批处理模式下使用 openGL 渲染器时所有文本都丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9337662/

相关文章:

python - numpy 中的 FFT 与 MATLAB 中的 FFT 没有相同的结果

python - 无法在 matlab 中导入 keras(python 生成)模型 - 不存在的字段 "class_name"

将 C 中的无符号字符转换为 MatLab

matlab - 如何仅根据日期(忽略时间)在日期时间数组中查找唯一值?

java - OpenGL 在面向对象模型中将 glVertexAttribPointer 放在哪里?

opengl - OpenGL等图形库的目的是什么?

c++ - 在 QGLWidget 中绘制一个 cv::Mat?

r - 如何在一个坐标系中绘制两个图表,组合一列的所有值?

python - Bokeh 图中的着色线

删除 R Spie 图中的标签边框