Bagaimana saya bisa men-debug apa yang sedang dirender ke Obyek Frame Buffer di OpenGL?

17

Saya memiliki cloud point yang sedang ditampilkan di layar. Setiap titik memiliki posisi dan warna serta ID.

Saya diminta untuk membuat ID untuk setiap titik ke tekstur jadi saya membuat FBO dan melampirkan dua tekstur, satu untuk warna dan satu untuk kedalaman. Saya membuat VAO dan VBO yang diperlukan untuk rendering di luar layar ini dan mengunggah untuk setiap titik posisi dan ID-nya.

Setelah rendering ke FBO selesai, saya membaca piksel dari tekstur warna dengan glReadPixels()untuk melihat apa nilai-nilainya, tetapi semuanya tampaknya dihapus, yaitu, nilai yang mereka miliki sama dengan glClearColor().

Apakah ada cara saya bisa men-debug apa yang sedang dirender ke tekstur warna FBO saya? Setiap tips yang Anda berikan sangat disambut.

BRabbit27
sumber

Jawaban:

21

Secara umum untuk melihat apa yang dirender dalam berbagai langkah pipa Anda, saya akan menyarankan penggunaan alat untuk analisis bingkai. Ini biasanya memberi Anda pandangan tentang konten setiap buffer untuk setiap panggilan API dan ini dapat membantu Anda dalam situasi Anda.

Yang sangat bagus adalah Renderdoc yang sepenuhnya gratis dan opensource. Juga didukung secara aktif.

Satu lagi adalah Intel IPK yang sayangnya, menurut halaman webnya, mendukung hingga OGL 3.3 Core.

Demi menambahkan satu lagi, saya biasa menggunakan gDEBugger , tetapi sudah lama berlalu sejak pembaruan terakhir. Ini telah berkembang menjadi AMD CodeXL yang sayangnya saya tidak pernah gunakan.

cifz
sumber
Selain itu saya juga kadang-kadang memiliki perintah yang akan membuang fbo keluar ke gambar ketika saya menekan tombol. Ini cara berteknologi rendah.
Jorge Rodriguez
Mungkin juga ide yang bagus untuk memastikan Anda memiliki setup tes kedalaman yang tepat, untuk rendering masuk ke FBO visualisasi Anda.
rys
Saya masih menggunakan gDEbugger dari waktu ke waktu untuk versi GL yang lebih lama. CodeXL adalah versi yang lebih modern dan dapat ditemukan di sini: github.com/GPUOpen-Tools/CodeXL Perhatikan bahwa ada daftar lengkap alat debugging grafis pada halaman apitrace di sini: apitrace.github.io/#links
Bim
11

Saya menguji beberapa aplikasi / API / perpustakaan untuk mendapatkan data dari FBO dalam aplikasi yang menggunakan gbuffer misalnya. Setelah berbulan-bulan menderita saya menemukan apitrace tersedia di Github untuk men-debug OpenGL, Direct3D dan WebGL. Saya menggunakan Windows dan Linux tanpa masalah.

Semoga bermanfaat bagi Anda.

esmitt
sumber
7

Selain respons cifz, cara lain untuk memvisualisasikan FBO yang tidak memerlukan biaya banyak kode adalah dengan menggunakan glBlitFramebuffer () untuk mentransfer piksel dari framebuffer ke jendela.

// XXX WARNING: Untested code follows

// Blit from fbo...
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
// ...to the front buffer.
glBindFramebuffer(GL_WRITE_FRAMEBUFFER, GL_FRONT);

GLsizei HalfWindowWidth = (GLsizei)(WindowWidth / 2.0f);
GLsizei HalfWindowHeight = (GLsizei)(WindowHeight / 2.0f);

// Blit attachment 0 to the lower-left quadrant of the window
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBlitFramebuffer(0, 0, FboWidth, FboHeight,
                  0, 0, HalfWindowWidth, HalfWindowHeight,
                  GL_COLOR_BUFFER_BIT, GL_LINEAR);

// Blit attachment 1 to the lower-right quadrant of the window
glReadBuffer(GL_COLOR_ATTACHMENT1);
glBlitFramebuffer(0, 0, FboWidth, FboHeight,
                  HalfWindowWidth, 0, WindowWidth, HalfWindowHeight,
                  GL_COLOR_BUFFER_BIT, GL_LINEAR);

// ...and so on. You can switch FBOs if you have more than one to read from.

Ada beberapa "gotcha" yang jelas, di mana buffer HDR mungkin tidak akan memvisualisasikan cara yang Anda harapkan, Anda mungkin tidak dapat "melihat" buffer stensil / stensil dengan cara yang jelas, dan jika ukuran FBO tidak tidak cocok dengan area yang sedang dibidik, metode pembesaran / minifikasi mungkin sangat naif.

Tapi ketika peretasan cepat terjadi, itu cukup bagus.

Nama samaran
sumber