2012-02-18 30 views
7

Khi chạy MATLAB ở chế độ hàng loạt không có hiển thị (ví dụ: $DISPLAY Biến môi trường UNIX chưa được đặt hoặc cờ matlab -nodisplay khi khởi động), thông thường bạn không thể sử dụng trình kết xuất opengl . Thay vào đó, bạn phải giải quyết cho trình kết xuất đồ họa painters. Ví dụ:Tất cả văn bản bị mất khi sử dụng trình kết xuất đồ họa OpenGL ở chế độ hàng loạt

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

Thật không may, painters thường cho kết quả kém khi làm việc với cảnh 3D với các bản vá lỗi, ánh sáng, minh bạch, vv .. Dưới đây là một ví dụ đơn giản (sử dụng một màn hình cho bây giờ), nơi alpha bị mất:

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

enter image description here


Do những hạn chế, tôi đã rất vui mừng để tìm ra chủ yếu là không có giấy tờ-01.230.chức năng MATLAB tích hợp, trong đó hiện bằng cách nào đó cho phép bạn sử dụng trình kết xuất opengl mà không hiển thị. Hàm này dựa trên hàm export_fig() tuyệt vời. Bây giờ tôi có thể tiết kiệm rất nhanh số liệu 3D chất lượng cao ở chế độ hàng loạt.

Tuy nhiên, có một lần bắt: Tất cả văn bản bị mất khi hình được truyền qua hàm hardcopy(). Ví dụ:

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 

Con số đầu ra là hoàn toàn thiếu bất kỳ văn bản (không trục ve nhãn và không có tiêu đề):

export_fig axis.png -opengl 

enter image description here

Vì vậy, những gì tôi đang tự hỏi là: Tôi làm cách nào để có được trình kết xuất đồ họa opengl hoạt động với văn bản ở chế độ hàng loạt? Có cách nào tôi có thể nhận văn bản để hoạt động với chức năng hardcopy() không? Có lẽ một cách để rasterize văn bản trước? Hoặc một cách để kết hợp một văn bản painters của văn bản và opengl bản cứng của cốt truyện? Ngoài ra, có một tuyến đường hoàn toàn khác để thực hiện công việc này hơn chức năng hardcopy() không? Cũng lưu ý rằng vấn đề là không thể được với thiết lập hệ thống của tôi, vì nó có thể tái sản xuất dưới cả Mac OS và Ubuntu.

+0

Bạn đã đọc [Mathworks post] này (http://www.mathworks.com/matlabcentral/newsreader/view_thread/300393) về phông chữ bị thiếu? –

+0

@JuanMellado Cảm ơn bạn đã tìm kiếm. Tôi đã đi qua thread đó trước, nhưng tôi không tin rằng phông chữ là một vấn đề ở đây. Tôi có thể sử dụng bất kỳ phông chữ nào của tôi trong 'listfonts' và chúng xuất tốt với họa sĩ ở cả chế độ tương tác và hàng loạt, và với opengl ở chế độ tương tác. Tôi không thể chắc chắn, nhưng chủ đề khác có thể đã gây nhầm lẫn 2 vấn đề riêng biệt. –

Trả lời

8

Nếu bạn đang sử dụng Linux, bạn có thể sử dụng trình kết xuất OpenGL phần mềm (phiên bản hiện đại Matlab có một gói). Tùy chọn này không tồn tại cho Mac OS, ít nhất là không có phiên bản Matlab hiện tại. Windows rất dễ dàng - ngay cả chế độ hàng loạt cũng chạy màn hình, vì vậy bạn có thể làm việc như bình thường.

  1. Chạy Xvfb :1 &, tạo trình tạo bộ đệm khung hình ảo (ảo).
  2. Chuẩn bị mã của bạn trong một số tập tin, nói bla.m:

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

    Nó rất quan trọng không quên opengl software, như bạn tưởng tượng.

  3. Chạy lệnh sau:

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

    mà làm Matlab thực hiện bất cứ điều gì trong bla.m, trên màn hình ảo, và viết bất cứ điều gì Matlab ngõ ra vào log.txt. Bạn có thể thả logfile khi mọi thứ dường như đang hoạt động. Ngoài ra, lưu ý rằng :display :1 phải khớp với số bạn đã cung cấp trong lời gọi Xvfb.

  4. Lợi nhuận.

+0

Đẹp! 'Xvfb' phù hợp với nhu cầu của tôi một cách hoàn hảo. Tôi không thể tin rằng tôi đã không đi qua nó trước. Cảm ơn. –

Các vấn đề liên quan