我正在嘗試對圖像文件進行一些OpenGL ES 2.0渲染,而不依賴於屏幕上向用戶顯示的渲染。我要呈現的圖像與用戶的屏幕大小不同。我只需要一個GL_RGB數據的字節數組。我熟悉glReadPixels,但我不認爲它會在這種情況下做到這一點,因爲我沒有從已經渲染的用戶屏幕拉出。將OpenGL ES 2.0渲染爲圖像
僞代碼:
// 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.
我怎麼能做到這一點,而無需中斷用戶的顯示?我寧願不必閃爍用戶的屏幕,爲單個幀繪製我想要的信息,glReadPixel-ing,然後讓它消失。
同樣,我不希望它向用戶顯示任何內容。這是我的代碼。不工作..我錯過了什麼嗎?
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);
我發現渲染到的一些信息 - 紋理,但我不知道這是我想要的,因爲我想呈現給一個te陣列用於保存/分析圖像數據。我很好奇正確的道路是什麼。 – user1054922 2013-05-12 16:30:32
緩衝區是否在屏幕上結束或者GPU仍然需要渲染。有沒有辦法讓屏幕外渲染不會影響性能... – 2013-05-12 16:35:20
我不是說影響性能,我只是說沒有向用戶展示任何東西(即閃爍) – user1054922 2013-05-12 16:37:50