Весь текст теряется при использовании рендерера openGL в пакетном режиме - PullRequest
7 голосов
/ 18 февраля 2012

При запуске 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

enter image description here


Из-за этих ограничений я был очень взволнован, обнаружив в основном недокументированную 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

enter image description here

Итак, что мне интересно: Как я могу заставить opengl рендерер работать с текстом в пакетном режиме? Есть ли способ заставить текст работать с функцией hardcopy() ? Возможно, способ растеризации текста заранее? Или способ объединить painters печатную копию текста и opengl печатную копию сюжета? В качестве альтернативы, есть ли совершенно другой способ заставить эту работу работать, чем функция hardcopy()? Также обратите внимание, что проблема, скорее всего, не связана с настройкой моей системы, поскольку она воспроизводима как в Mac OS, так и в Ubuntu.

1 Ответ

8 голосов
/ 23 февраля 2012

Если вы используете 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 software, как вы себе представляете.

  3. Выполнитьследующая команда:

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

    , которая заставляет Matlab выполнять все, что находится в bla.m, на виртуальном дисплее и записывает все, что Matlab выводит в log.txt.Вы можете удалить файл журнала, когда кажется, что все работает.Также обратите внимание, что :display :1 должен соответствовать номеру, который вы указали в вызове Xvfb.

  4. Прибыль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...