在OpenGL 中離屏渲染場景允許在不需要可見窗口的情況下生成圖像。當為離屏處理執行大量計算或捕獲影像以供以後使用時,此技術特別有用。
離屏渲染的一種方法是直接讀取內容幀緩衝區。這可以使用 glReadPixels 函數來實現:
std::vector<std::uint8_t> data(width * height * 4); glReadBuffer(GL_BACK); glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, &data[0]);
此方法將像素從指定緩衝區(在本例中為後台緩衝區)讀取到預先分配的記憶體緩衝區中。然而,這種方法也有局限性,例如速度較慢,並且可能會幹擾其他渲染操作。
幀緩衝物件 (FBO) 提供了一種更優化的方法渲染離屏。它們允許您創建一個專用的離屏幀緩衝區,可以獨立地繪製和讀取它:
GLuint fbo, render_buf; glGenFramebuffers(1, &fbo); glGenRenderbuffers(1, &render_buf); glBindRenderbuffer(render_buf); glRenderbufferStorage(GL_RENDERBUFFER, GL_BGRA8, width, height); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_buf);
設置FBO 後,您可以將其綁定為繪製目標並渲染到它,而不是預設幀緩衝區。當您準備好讀取渲染像素時,將FBO 綁定為讀取目標:
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); // Draw to the offscreen framebuffer glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); glReadBuffer(GL_COLOR_ATTACHMENT0); glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, &data[0]);
像素緩衝區物件(PBO ) 可以用於透過非同步執行操作來提高像素傳輸的效率:
GLuint pbo; glGenBuffers(1, &pbo); glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo); glBufferData(GL_PIXEL_PACK_BUFFER, width * height * 4, NULL, GL_DYNAMIC_READ);
而不是將指標傳遞給glReadPixels 中的像素數據,可以提供PBO 的偏移量。稍後使用 glMapBuffer 將 PBO 映射到系統記憶體:
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo); glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, 0); // Offset in the PBO pixel_data = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
最佳的離屏渲染方法取決於應用程式的特定要求。 FBO 通常提供性能和靈活性的最佳平衡,而 PBO 在最大速度至關重要的情況下非常有用。對於簡單的任務,直接讀取幀緩衝區可能就足夠了。
以上是如何在 OpenGL 中高效率地離屏渲染?的詳細內容。更多資訊請關注PHP中文網其他相關文章!