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를 그리기 대상으로 바인딩하고 대신 렌더링할 수 있습니다. 기본 프레임버퍼. 렌더링된 픽셀을 읽을 준비가 되면 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의 오프셋을 제공할 수 있습니다. PBO는 나중에 glMapBuffer를 사용하여 시스템 메모리에 매핑됩니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!