Mengapa menggunakan glReadBuffer / glReadPixels mengembalikan gambar hitam pada kartu Intel?


8

Saya punya kode ini

glReadBuffer( GL_FRONT );
glReadPixels( 0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer ); 

Yang bekerja dengan sempurna di semua GPU Nvidia dan AMD yang saya coba, tetapi gagal di hampir setiap video built-in Intel yang saya coba. Ini sebenarnya bekerja di 945GME yang sangat lama, tetapi gagal di semua yang lain. Alih-alih mendapatkan tangkapan layar, saya malah mendapatkan layar hitam.

Jika itu membantu, saya bekerja dengan Mesin Doom3, dan kode itu berasal dari kode tangkapan layar bawaan. Ngomong-ngomong, bahkan dengan game aslinya aku toh tidak bisa melakukan screen capture pada perangkat intel itu. Dugaan saya adalah bahwa mereka tidak menerapkan standar dengan benar atau sesuatu. Apakah ada solusi untuk ini?


1
Bisakah Anda memberi kami beberapa contoh spesifik chipset video bawaan Intel yang gagal? Supaya kita semua yakin kita sedang membicarakan hal yang sama. (Kode saya terlihat sangat mirip dengan Anda, kebetulan)
Trevor Powell

Saya menggunakan Intel 945.965, GMA HD dan tidak ada yang bekerja. Mereka berada di beberapa inspiron 1525, yang lain dari inspiron 1764. Yang berhasil adalah Intel 950 yang sangat tua dari Acer Aspire One 110L. Apakah Anda dapat memperbaikinya?
cloudraven

3
Mungkin Anda perlu membaca dari buffer GL_BACK? Halaman manual OpenGL mengatakan itu adalah default untuk mode buffer ganda. Tetapi untuk referensi, kode di atas (dengan GL_FRONT atau GL_BACK) berfungsi pada kartu Intel HD saya.
QuasarDonkey

Saya akan mencobanya besok. Aneh, bukankah itu seharusnya perilaku yang tidak terdefinisi? Yah, saya bisa mewujudkannya hanya pada kartu intel.
cloudraven

Cloudraven, saya akan memeriksa RB_ExecuteBackEndCommands dari tr_backend.cpp untuk kasus-kasus di mana backbuffer dapat dihapus sebelum panggilan Anda dari ReadPixels.
Jing

Jawaban:


4

Grafik Intel secara historis selalu memiliki masalah dengan membaca dari, atau menggambar ke, buffer depan. Aturan praktis yang baik yang saya ikuti dengan Intel adalah ini - jika Anda tidak dapat melakukannya di D3D maka jangan coba-coba melakukannya di OpenGL, bahkan jika spesifikasi mengatakan bahwa Anda harus bisa - dan D3D tidak izinkan akses ke buffer depan dengan cara ini jadi ... cukup gunakan GL_BACK saja.


Ya, saya lebih suka menggunakan GL_BACK, tapi GL_FRONT. Hanya saja GL_BACK tidak berfungsi. Cukup lucu, GL_FRONT tampaknya berfungsi, tetapi saya belum mengujinya secara menyeluruh.
cloudraven
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.