Memaparkan adegan di luar skrin dalam OpenGL membolehkan penjanaan imej tanpa memerlukan tetingkap yang boleh dilihat. Teknik ini amat berguna apabila melakukan pengiraan berat untuk pemprosesan luar skrin atau menangkap imej untuk kegunaan kemudian.
Salah satu cara untuk memaparkan di luar skrin adalah dengan membaca kandungan secara terus daripada framebuffer. Ini boleh dicapai menggunakan fungsi 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]);
Kaedah ini membaca piksel daripada penimbal yang ditentukan (dalam kes ini, penimbal belakang) ke dalam penimbal memori yang telah diperuntukkan terlebih dahulu. Walau bagaimanapun, pendekatan ini mempunyai had, seperti menjadi lebih perlahan dan berpotensi mengganggu operasi pemaparan lain.
Objek Framebuffer (FBO) menyediakan cara yang lebih optimum untuk memaparkan di luar skrin. Ia membenarkan anda membuat penampan rangka luar skrin khusus, yang boleh ditarik ke dan dibaca daripadanya secara bebas:
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);
Setelah FBO disediakan, anda boleh mengikatnya sebagai sasaran lukisan dan menjadikannya bukannya framebuffer lalai. Apabila anda sudah bersedia untuk membaca piksel yang diberikan, ikat FBO sebagai sasaran baca:
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]);
Objek Penampan Pixel (PBO) boleh digunakan untuk menjadikan pemindahan piksel lebih cekap dengan melakukan operasi secara tak segerak:
GLuint pbo; glGenBuffers(1, &pbo); glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo); glBufferData(GL_PIXEL_PACK_BUFFER, width * height * 4, NULL, GL_DYNAMIC_READ);
Daripada menghantar penuding kepada data piksel dalam glReadPixels, ofset PBO boleh disediakan. PBO dipetakan ke memori sistem kemudian menggunakan 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);
Kaedah pemaparan luar skrin yang optimum bergantung pada keperluan khusus aplikasi. FBO secara amnya memberikan keseimbangan prestasi dan fleksibiliti yang terbaik, manakala PBO berguna dalam situasi di mana kelajuan maksimum adalah penting. Untuk tugasan mudah, bacaan framebuffer langsung mungkin memadai.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memaparkan Luar Skrin dengan Cekap dalam OpenGL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!