Tôi đang cố gắng thực hiện một số kết xuất OpenGL ES 2.0 cho tệp hình ảnh, độc lập với hiển thị được hiển thị trên màn hình cho người dùng. Hình ảnh tôi đang hiển thị là kích thước khác với màn hình của người dùng. Tôi chỉ cần một mảng byte dữ liệu GL_RGB. Tôi quen thuộc với glReadPixels, nhưng tôi không nghĩ rằng nó sẽ làm các trick trong trường hợp này kể từ khi tôi không kéo từ một màn hình người dùng đã được trả lại.Làm cho OpenGL ES 2.0 thành hình ảnh
Mã giả:
// Switch rendering to another buffer (framebuffer? renderbuffer?)
// Draw code here
// Save byte array of rendered data GL_RGB to file
// Switch rendering back to user's screen.
Làm thế nào tôi có thể làm điều này mà không làm gián đoạn màn hình của người dùng? Tôi không muốn phải nhấp nháy màn hình của người dùng, vẽ thông tin mong muốn của tôi cho một khung hình duy nhất, glReadPixel-ing và sau đó làm cho nó biến mất.
Một lần nữa, tôi không muốn nó hiển thị bất cứ điều gì cho người dùng. Đây là mã của tôi. Không hoạt động .. Tôi đang thiếu một cái gì đó?
unsigned int canvasFrameBuffer;
bglGenFramebuffers(1, &canvasFrameBuffer);
bglBindFramebuffer(BGL_RENDERBUFFER, canvasFrameBuffer);
unsigned int canvasRenderBuffer;
bglGenRenderbuffers(1, &canvasRenderBuffer);
bglBindRenderbuffer(BGL_RENDERBUFFER, canvasRenderBuffer);
bglRenderbufferStorage(BGL_RENDERBUFFER, BGL_RGBA4, width, height);
bglFramebufferRenderbuffer(BGL_FRAMEBUFFER, BGL_COLOR_ATTACHMENT0, BGL_RENDERBUFFER, canvasRenderBuffer);
unsigned int canvasTexture;
bglGenTextures(1, &canvasTexture);
bglBindTexture(BGL_TEXTURE_2D, canvasTexture);
bglTexImage2D(BGL_TEXTURE_2D, 0, BGL_RGB, width, height, 0, BGL_RGB, BGL_UNSIGNED_BYTE, 0);
bglFramebufferTexture2D(BGL_FRAMEBUFFER, BGL_COLOR_ATTACHMENT0, BGL_TEXTURE_2D, canvasTexture, 0);
Matrix::matrix_t identity;
Matrix::LoadIdentity(&identity);
bglClearColor(1.0f, 1.0f, 1.0f, 1.0f);
bglClear(BGL_COLOR_BUFFER_BIT);
Draw(&identity, &identity, this);
bglFlush();
bglFinish();
byte *buffer = (byte*)Z_Malloc(width * height * 4, ZT_STATIC);
bglReadPixels(0, 0, width, height, BGL_RGB, BGL_UNSIGNED_BYTE, buffer);
SaveTGA("canvas.tga", buffer, width, height);
Z_Free(buffer);
// unbind frame buffer
bglBindRenderbuffer(BGL_RENDERBUFFER, 0);
bglBindFramebuffer(BGL_FRAMEBUFFER, 0);
bglDeleteTextures(1, &canvasTexture);
bglDeleteRenderbuffers(1, &canvasRenderBuffer);
bglDeleteFramebuffers(1, &canvasFrameBuffer);
Tôi tìm thấy một số thông tin về làm-to -texture, nhưng tôi không chắc đó là những gì tôi muốn, vì tôi muốn kết xuất bằng te mảng để lưu/phân tích dữ liệu hình ảnh. Tôi tò mò muốn biết con đường chính xác là gì. – user1054922
Liệu bộ đệm có kết thúc trên màn hình hay không, GPU vẫn phải hiển thị. Không có cách nào để hiển thị offscreen không ảnh hưởng đến hiệu suất ... –
Tôi không nói về ảnh hưởng đến hiệu suất, tôi đang nói về việc không hiển thị bất kỳ điều gì cho người dùng (ví dụ: nhấp nháy) – user1054922