При запуске 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-сценами с патчами, освещением, прозрачностью и т. Д. Вот один простой пример (пока использующий дисплей), где альфа теряется:
peaks
alpha(0.5)
print -dpng -opengl peaks_opengl.png
print -dpng -painters peaks_painters.png
Из-за этих ограничений я был очень взволнован, обнаружив в основном недокументированную hardcopy()
встроенную функцию MATLAB, которая делает каким-то образом позволяет использовать средство визуализации opengl
без дисплея. Эта функция лежит в основе потрясающей функции export_fig()
. Теперь я могу очень быстро сохранять высококачественные трехмерные фигуры в пакетном режиме.
Однако есть одна загвоздка: Весь текст теряется при прохождении рисунка через функцию 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.