在批处理模式下使用 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 渲染器时所有文本都会丢失的主要内容,如果未能解决你的问题,请参考以下文章

OpenGl固定管线各种存储着色器

OpenGl固定管线各种存储着色器

如何为 OpenGL 文本渲染计算字符映射中的最佳字形边界

OpenGL sprite 以低质量绘制

在使用VR渲染器时模型不显示纹理

◮OpenGL-文本渲染