2009-03-25 28 views
10

Tôi đang hiển thị đối tượng framebuffer ngoài khung hình OpenGL và muốn lưu nó dưới dạng hình ảnh. Lưu ý rằng FBO lớn hơn kích thước hiển thị. Tôi có thể đưa vào bộ đệm ngoài màn hình và sử dụng nó làm kết cấu, hoạt động. Tôi có thể "cuộn" texture lớn hơn này qua màn hình bằng cách sử dụng một offset, điều này làm tôi tự tin, rằng tôi render vào một bối cảnh lớn hơn cửa sổ.vấn đề tiết kiệm openGL FBO lớn hơn cửa sổ

Nếu tôi lưu bộ đệm ngoài màn hình vào một tệp hình ảnh, nó luôn bị cắt. Các đoạn mã cho tiết kiệm là:

void ofFBOTexture::saveImage(string fileName) { 
    glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 
    // get the raw buffer from ofImage 
    unsigned char* pixels = imageSaver.getPixels(); 
    glReadPixels(0, 0, 1024, 1024, GL_RGB, GL_UNSIGNED_BYTE, pixels); 

    imageSaver.saveImage(fileName); 
} 

Xin lưu ý, rằng nội dung hình ảnh được cắt, phần nhìn thấy được lưu một cách chính xác (có nghĩa là không có lỗi trong các định dạng pixel, vấn đề GL_RGB vv), nhưng không gian còn lại là đầy một màu.

Vì vậy, câu hỏi của tôi là - tôi đang làm gì sai?

Trả lời

11

Cuối cùng tôi đã giải quyết được vấn đề.

tôi phải kích hoạt FBO để lưu nội dung của nó:

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); 
// save code 
... 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 

trong khi chỉ chọn FBO cho glReadPixels qua

glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 

không đủ.

(Tất cả những thứ khác mà đúng và thử nghiệm, ví dụ. Kích thước khung nhìn, chiều rộng và chiều cao của đệm, hình ảnh kết cấu, vv)

+0

Tôi đang gặp vấn đề tương tự như bạn. Bạn có thể mở rộng về cách bạn có được biến fbo không? Tôi không thể tìm thấy những gì cần đưa vào để truy cập glGenFrameBuffers, đó là những gì tôi nghĩ được sử dụng. –

+1

1. đây là một mô tả tốt: http://www.songho.ca/opengl/gl_fbo.html – razong

+1

2. GLuint fbo; glGenFramebuffersEXT (1, &fbo); // 1 == số fbo để tạo glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, fbo); – razong

0

Hai câu hỏi để bắt đầu: Bạn tạo imageSaver như thế nào và bạn có chắc chiều rộng và chiều cao của mình chính xác không (ví dụ: bạn đang cố gắng lưu hình ảnh 1024 x 1024? Bạn nhận được kích thước nào)?

+0

1. imageSaver là một đối tượng hình ảnh openframeworks. Để tránh các lỗi có thể xảy ra, tôi thậm chí còn tạo ra nó thông qua tải một tệp bitmap trống với kích thước và chiều sâu của hình ảnh mục tiêu mong muốn của tôi. 2. Tôi nhận được hình ảnh 1024x1024, như mong muốn nhưng chỉ nội dung bằng với cửa sổ được hiển thị. mọi thứ khác là "trống" – razong

0

Bạn không làm gì sai, đây là hành vi khá phổ biến với trình điều khiển đồ họa OpenGL trong một thời gian dài - tôi nhớ chạy lại chính xác cùng một vấn đề trên thẻ nVidia Geforce 3 ít nhất một thập kỷ trước và tôi đã áp dụng một giải pháp tương tự - hiển thị kết cấu không có màn hình.

0

Điều này có vẻ như bạn có kích thước khung nhìn sai hoặc tương tự.