OpenGL'de bir Çerçeve Arabelleği Nesnesi'ne neyin oluşturulduğunu nasıl ayıklayabilirim?


17

Ekrana işlenen bir nokta bulutum var. Her noktanın konumu ve rengi ve bir kimliği vardır.

Her nokta için kimlikleri bir dokuya dönüştürmem istendi, bu yüzden bir FBO oluşturdum ve biri renk diğeri derinlik için iki doku ekledim. Bu ekran dışı oluşturma için gerekli VAO ve VBO'yu oluşturdum ve her nokta için konumu ve kimliği yükledim.

FBO'ya render işlemi tamamlandığında, glReadPixels()değerlerin ne olduğunu görmek için renk dokusunun piksellerini okudum , ancak hepsi temizlenmiş gibi görünüyor, yani sahip oldukları değer aynı glClearColor().

FBO'mun renk dokusuna ne yapıldığını hata ayıklamanın bir yolu var mı? Sağlayabileceğiniz ipuçları çok memnuniyetle karşılanmaktadır.

Yanıtlar:


21

Genellikle boru hattınızın çeşitli adımlarında neler yapıldığını görmek için çerçeve analizi için bir araç kullanmanızı öneririm. Bunlar genellikle her bir API çağrısı için her arabellek içeriği hakkında bir görünüm sağlar ve bu durumunuzda size yardımcı olabilir.

Çok iyi olanı, hem tamamen ücretsiz hem de açık kaynak olan Renderdoc'tur . Ayrıca aktif olarak desteklenmektedir.

Bir diğeri, maalesef web sayfasına göre OGL 3.3 Core'a kadar destek veren Intel GPA .

Sadece bir tane daha eklemek uğruna, gDEBugger kullanıyordum , ancak son güncellemeden bu yana çok geçti. Bu, maalesef hiç kullanmadığım AMD CodeXL'e dönüştü .


Ayrıca, bazen bir tuşa bastığımda belirli bir fbo'yu bir görüntüye dökecek bir komutum var. Düşük teknoloji yolu.
Jorge Rodriguez

Görselleştirme FBO'nuza girmesi için doğru derinlik testi kurulumuna sahip olduğunuzdan emin olmak da iyi bir fikirdir.
rys

Hala eski GL sürümleri için gDEbugger kullanıyorum. CodeXL daha modern bir sürümüdür ve burada bulunabilir: github.com/GPUOpen-Tools/CodeXL Burada apitrace sayfasında grafik hata ayıklama araçlarının kapsamlı bir listesi olduğunu unutmayın: apitrace.github.io/#links
Bim

11

Örneğin gbuffer kullanan uygulamalarda FBO'lardan veri almak için çeşitli uygulamaları / API'leri / kütüphaneleri test ettim. Aylarca süren acılardan sonra, Github'da OpenGL, Direct3D ve WebGL'de hata ayıklamak için kullanılabilecek apitrace'i keşfettim . Windows ve Linux'ta sorunsuz kullandım.

Umarım bu sizin için yararlı olabilir.


7

Cifz'in yanıtına ek olarak, çok fazla kod içermeyen FBO'ları görselleştirmenin başka bir yolu, pikselleri bir çerçeve tamponundan bir pencereye aktarmak için glBlitFramebuffer () kullanmaktır.

// 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.

Birkaç belirgin "gotchas" vardır, çünkü HDR tamponları muhtemelen beklediğiniz şekilde görselleştirmez, muhtemelen derinlik / şablon tamponlarını bariz şekilde "göremezsiniz" ve eğer FBO'nun boyutu Köreltilen alanla uyuşmadığında büyütme / küçültme yöntemi son derece saf olabilir.

Ama çabuk kirli hackler giderken, oldukça iyi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.