OpenGL でシーンをオフスクリーン レンダリングすると、表示ウィンドウを必要とせずにイメージを生成できます。この手法は、オフスクリーン処理のための大量の計算を実行する場合や、後で使用するために画像をキャプチャする場合に特に役立ちます。
オフスクリーンをレンダリングする 1 つの方法は、コンテンツを直接読み取ることです。フレームバッファの。これは、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 中国語 Web サイトの他の関連記事を参照してください。