Apa isi buffer * setelah * panggilan ke glSwapBuffers ()?

8

( SDL_GL_SwapBuffers()khususnya)

Ketika Anda telah menggambar adegan, dan Anda memanggil swap-buffer, itu adalah rutin untuk glClear()adegan itu sebelum menggambar apa pun; jika Anda tidak jelas, apa isi buffer? Apakah ini ditentukan oleh spesifikasi apa pun, atau apakah berbeda menurut driver?

Akan
sumber
Ini pertanyaan yang sangat menarik.
Notabene

Jawaban:

13

Rincian cara menukar penyangga depan dan belakang bervariasi dari satu platform ke platform lainnya, jadi jawabannya tergantung pada platform.

Menurut dokumentasi referensi GLX glXSwapBuffers :

Isi buffer kembali menjadi tidak terdefinisi setelah swap. Perhatikan bahwa ini berlaku untuk buffer piksel dan juga windows.

Namun, ada ekstensi GLX_EXT_buffer_age :

Tujuan dari ekstensi ini adalah untuk memaparkan informasi yang cukup ke aplikasi tentang bagaimana pengemudi mengelola set buffer depan dan belakang yang terkait dengan permukaan yang diberikan untuk memungkinkan aplikasi menggunakan kembali isi dari frame lama dan meminimalkan berapa banyak yang harus digambar ulang untuk bingkai selanjutnya.

Tetapi Win32 SwapBuffers hanya mengatakan:

Jika format piksel saat ini untuk jendela yang direferensikan oleh konteks perangkat ini termasuk buffer belakang, fungsi bertukar buffer depan dan belakang ... Jika format piksel saat ini untuk jendela yang direferensikan oleh konteks perangkat tidak termasuk buffer belakang, ini panggilan tidak berpengaruh dan konten buffer belakang tidak ditentukan saat fungsi kembali.

Dan CGLFlushDrawable, untuk OS X Core Graphics mengatakan:

Jika atribut backing store disetel ke false, buffer dapat ditukar daripada disalin. Ini sering terjadi dalam mode layar penuh. Jika penerima bukan konteks buffer ganda, panggilan ini tidak melakukan apa-apa.

Akhirnya, dalam fungsi pertukaran-standar OpenGL ES eglSwapBuffers :

Buffer warna permukaan tidak terdefinisi setelah memanggil eglSwapBuffers.

Jadi apa artinya semua ini?

  • Untuk benar-benar lintas platform, Anda tidak dapat menganggap apa pun tentang buffer belakang setelah swap. Kontennya tidak terdefinisi, dan Anda mungkin harus glClear atau memperbaikinya sebelum menggunakannya.
  • Jika Anda menggunakan Linux, Anda dapat memeriksa ekstensi usia penyangga. Karena sebuah sistem mungkin memiliki tiga buffer, Anda mungkin harus melacak beberapa frame yang bernilai kerusakan dan menanganinya.
  • Jika Anda menggunakan OS X, Anda mungkin akan disalin, dan Anda mungkin mendapat pertukaran. Jadi Anda bisa berasumsi bahwa isi backbuffer bukanlah sampah, tetapi Anda tidak mengontrol apakah itu frame yang baru saja Anda kirim atau yang sebelumnya.
  • Jika Anda hanya menargetkan Win32 dan yakin Anda memiliki penyangga belakang, Anda dapat mengasumsikan isinya sekarang ada di penyangga depan. (Meskipun ini adalah asumsi dari kelalaian daripada secara eksplisit dinyatakan; Saya tidak akan terkejut jika tidak bekerja pada banyak / konfigurasi apa pun.)

Mengingat kendala GLX dan CGL, dan keinginan untuk meminimalkan perubahan antara OpenGL dan OpenGL ES, Anda mungkin juga hanya menganggap isinya sampah.

Sunny Sachanandani
sumber
1

Dari apa yang saya baca, satu-satunya perilaku TIDAK DIKENAL. Jadi saya akan berasumsi tidak ada jaminan untuk apa yang akan menjadi isi buffer. Belum lagi bahwa beberapa lib sebenarnya membungkus panggilan yang jelas ke panggilan buffer swap.

David Yenglin
sumber
-1 karena kurangnya sumber; Dokumentasi OpenGL berlimpah dan mudah dihubungkan.
+1 karena, yah, dia benar-benar menjawab dan jawabannya benar. Sumber pasti membantu, tetapi sama sekali tidak diperlukan!
o0 '.
@ Lo'oris: Kecuali, yah, dia tidak benar. Dia benar untuk beberapa platform, tetapi tidak semua, seperti jawaban saya menjelaskan.
@ Jo: Satu-satunya jawaban yang benar terlepas dari "lingkungan" adalah yang ini, seperti jawaban Anda menjelaskan. Pengkodean mengetahui bahwa ini akan merusak "suatu tempat" pada awalnya akan salah.
o0 '.
1
@ Lo'oris: Semua kode, terutama kode render, kemungkinan akan pecah di suatu tempat . Jawaban yang bagus tidak hanya mengatakan itu, tetapi juga menjelaskan di mana itu.
0

Perilaku ini TIDAK DILAKUKAN, jadi jika Anda tetap mengisi seluruh layar, Anda dapat mempertimbangkan untuk menghapus yang jelas .. kecuali, pada beberapa lingkungan (setidaknya arsitektur ubin tertentu), yang sebenarnya akan menurunkan kinerja. Layar penuh jelas pada awal rendering adalah operasi yang sangat umum sehingga saya akan terkejut jika itu tidak dioptimalkan dengan baik pada semua platform target.

Alasan mengapa itu TIDAK DILAKUKAN adalah bahwa bagi banyak arsitektur, membuat status konten yang didefinisikan akan menjadi overhead tambahan, terlepas dari bagaimana Anda akan mendefinisikan standar.

Mengenai apa yang akan Anda temukan di sana, saya bisa menebak berdasarkan pengalaman;

Pada arsitektur buffered ganda (atau multi-), seperti kebanyakan perangkat keras video PC desktop, Anda mungkin akan menemukan data buffer "lain". Ini tidak dijamin, karena tidak ada dalam spesifikasi, jika beberapa optimasi aneh mendapat manfaat darinya, mereka akan memutarbalikkan data.

Pada arsitektur ubin, Anda mungkin menemukan data yang sama dengan bingkai terakhir, beberapa data yang dikacaukan secara aneh berdasarkan ukuran ubin, atau hal lainnya.

Kemudian Anda memiliki beberapa arsitektur eksentrik (seperti NDS) yang mungkin memberikan apa saja kepada Anda, karena definisi penyangga mereka tidak persis seperti yang Anda harapkan.

Jari Komppa
sumber
Wow, suara negatif. Saya serius tentang apa yang saya tulis - terutama jika Anda menulis untuk perangkat keras seluler, pastikan untuk memasukkan yang jelas di sana.
Jari Komppa
Saya tidak memilih karena jawaban Anda hampir identik dengan jawaban David, masih tidak memiliki referensi, dan seperti jawaban David, tidak benar atau keseluruhan cerita.
Baik. Namun, satu-satunya referensi yang bisa saya berikan adalah pengalaman saya sendiri. Saya akan lebih berhati-hati.
Jari Komppa
Saya menurunkan suara karena jawaban ini benar-benar terburuk daripada dua lainnya (yang saya unduh): tidak menambahkan apa-apa dan jauh lebih tidak jelas.
o0 '.