在批处理模式下使用 openGL 渲染器时所有文本都会丢失
Posted
技术标签:
【中文标题】在批处理模式下使用 openGL 渲染器时所有文本都会丢失【英文标题】:All text is lost when using openGL renderer in batch mode 【发布时间】:2012-02-18 01:23:35 【问题描述】:在没有显示的批处理模式下运行 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 下重现。
【问题讨论】:
你读过这篇Mathworks post关于缺少文字字体的文章吗? @JuanMellado 感谢您的搜索。我之前确实遇到过那个帖子,但我不相信字体在这里是个问题。我可以在listfonts
中使用我的任何字体,并且它们在交互和批处理模式下都可以很好地导出,并且在交互模式下使用 opengl。我不能确定,但其他线程可能混淆了 2 个不同的问题。
【参考方案1】:
如果您使用的是 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
调用中提供的数字相符。
利润。
【讨论】:
漂亮!Xvfb
完全符合我的需求。我不敢相信我以前没有遇到过。谢谢。以上是关于在批处理模式下使用 openGL 渲染器时所有文本都会丢失的主要内容,如果未能解决你的问题,请参考以下文章