2012-02-18 11 views
7

Cuando se ejecuta MATLAB en un modo discontinuo sin pantalla (por ejemplo, con el medio ambiente $DISPLAY UNIX variables definida, o con la bandera matlab -nodisplay en el arranque), normalmente no se puede utilizar el procesador de opengl . En su lugar, debe conformarse con el renderizador painters. Por ejemplo:Todo el texto se pierde cuando se utiliza renderizador OpenGL en modo batch

>> print -dpng -opengl fig.png 
Warning: OpenGL mode can not be used in terminal emulation mode; ignoring option. 

Desafortunadamente, painters menudo da malos resultados cuando se trabaja con escenas 3D con parches, la iluminación, la transparencia, etc .. Aquí es un ejemplo simple (utilizando una pantalla por ahora), donde se pierde la alfa:

peaks 
alpha(0.5) 
print -dpng -opengl peaks_opengl.png 
print -dpng -painters peaks_painters.png 

enter image description here


Debido a estas limitaciones, yo estaba muy emocionado de encontrar la mayoría indocumentado-hardcopy() función incorporada de MATLAB, que hace de alguna manera le permite usar el representador opengl sin una pantalla. Esta función es la base de la excelente función export_fig(). Ahora puedo guardar muy rápidamente figuras 3D de alta calidad en modo por lotes.

Sin embargo, hay una trampa: Todo el texto se pierde cuando se pasa la figura a través de la función hardcopy(). Por ejemplo:

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 

La cifra de producción se carece por completo cualquier texto (sin eje garrapatas etiquetas y ningún título):

export_fig axis.png -opengl 

enter image description here

Así que lo que estoy preguntando es: ¿Cómo puedo hacer que el renderizador opengl trabaje con texto en modo por lotes? ¿Hay alguna forma de que pueda hacer que el texto funcione con la función hardcopy()? ¿Quizás una forma de rasterizar el texto de antemano? O una forma de combinar una copia impresa del texto painters y una copia impresa opengl de la trama? Alternativamente, ¿existe una ruta completamente diferente para hacer que esto funcione que la función hardcopy()? También tenga en cuenta que es poco probable que el problema sea con la configuración de mi sistema, ya que es reproducible en Mac OS y Ubuntu.

+0

¿Has leído esta [publicación de Mathworks] (http://www.mathworks.com/matlabcentral/newsreader/view_thread/300393) sobre una fuente de texto faltante? –

+0

@JuanMellado Gracias por buscar. Encontré ese hilo antes, pero no creo que la fuente sea un problema aquí. Puedo usar cualquiera de mis fuentes en 'listfonts' y exportan bien con pintores tanto en modo interactivo como por lotes, y con OpenGL en modo interactivo. No puedo estar seguro, pero ese otro hilo podría haber confundido 2 problemas separados. –

Respuesta

8

Si está utilizando Linux, puede usar un software de renderizador OpenGL (las versiones modernas de Matlab tienen un paquete). Tal opción no existe para Mac OS, al menos no con las versiones actuales Matlab. Windows es fácil: incluso el modo por lotes ejecuta una pantalla para que pueda trabajar como siempre.

  1. Ejecute Xvfb :1 &, que crea un servidor X (virtual) framebuffer X.
  2. Preparar su código en algún archivo, por ejemplo bla.m:

    opengl software; 
    peaks 
    alpha(0.5); 
    print -dpng -opengl peaks_opengl.png 
    exit 
    

    Es muy importante no olvidar opengl software, como se imagina.

  3. Ejecutar el siguiente comando:

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

    que hace Matlab ejecutar lo que sea que en bla.m, en la pantalla virtual, y escribe cualquier Matlab salidas en log.txt. Puede soltar el archivo de registro cuando todo parece estar funcionando. Además, tenga en cuenta que :display :1 debe ajustarse al número que proporcionó en la invocación Xvfb.

  4. Beneficio.

+0

¡Hermoso! 'Xvfb' se ajusta perfectamente a mis necesidades. No puedo creer que no me haya encontrado antes. Gracias. –

Cuestiones relacionadas