Jak mogę debugować to, co jest renderowane do obiektu bufora ramki w OpenGL?


17

Mam chmurę punktów renderowaną na ekran. Każdy punkt ma swoją pozycję i kolor, a także identyfikator.

Poproszono mnie o renderowanie identyfikatorów dla każdego punktu tekstury, więc utworzyłem FBO i dołączyłem dwie tekstury, jedną dla koloru, a drugą dla głębi. Stworzyłem niezbędne VAO i VBO do tego renderowania poza ekranem i przesłałem dla każdego punktu jego pozycję i identyfikator.

Po zakończeniu renderowania do FBO czytam piksele tekstury kolorów, glReadPixels()aby zobaczyć, jakie są wartości, ale wydaje się, że wszystkie zostały usunięte, tj. Wartość, którą mają, jest taka sama glClearColor().

Czy istnieje sposób, w jaki mogę debugować to, co renderuje na fakturze kolorów mojego FBO? Wszelkie wskazówki, które możesz podać, są bardzo mile widziane.

Odpowiedzi:


21

Ogólnie, aby zobaczyć, co jest renderowane na różnych etapach potoku, sugeruję użycie narzędzia do analizy ramek. Zazwyczaj zapewniają one widok zawartości każdego bufora dla każdego wywołania API, co może pomóc w twojej sytuacji.

Bardzo dobrym jest Renderdoc, który jest zarówno całkowicie darmowy, jak i open source. Również jest aktywnie wspierany.

Kolejnym jest Intel GPA, który niestety, zgodnie ze swoją stroną internetową, obsługuje do OGL 3.3 Core.

Tylko w celu dodania jeszcze jednego użyłem gDEBuggera , ale minęło już dużo czasu od ostatniej aktualizacji. To przekształciło się w AMD CodeXL, którego niestety nigdy nie użyłem.


Ponadto czasami mam polecenie, które zrzuci określone fbo na obraz po naciśnięciu klawisza. Jest to technika mało zaawansowana.
Jorge Rodriguez

Prawdopodobnie dobrym pomysłem jest upewnienie się, że masz prawidłową konfigurację testu głębokości, aby renderowanie przechodziło do FBO wizualizacji.
rys

Nadal używam gDEbuggera od czasu do czasu dla starszych wersji GL. CodeXL jest bardziej nowoczesną wersją i można go znaleźć tutaj: github.com/GPUOpen-Tools/CodeXL Należy pamiętać, że na stronie apitrace znajduje się pełna lista narzędzi do debugowania grafiki: apitrace.github.io/#links
Bim

11

Przetestowałem kilka aplikacji / interfejsów API / bibliotek, aby uzyskać dane od FBO w aplikacjach, które wykorzystują na przykład gbuffer. Po miesiącach cierpienia odkryłem apitrace dostępny na Github do debugowania OpenGL, Direct3D i WebGL. Używałem w systemie Windows i Linux bez problemów.

Mam nadzieję, że może ci się to przydać.


7

Oprócz odpowiedzi cifz, innym sposobem wizualizacji FBO, które nie kosztują dużo kodu, jest użycie glBlitFramebuffer () do przeniesienia pikseli z bufora ramki do okna.

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

Istnieje kilka oczywistych „gotchas”, ponieważ bufory HDR prawdopodobnie nie będą wizualizować w sposób, w jaki się ich spodziewasz, prawdopodobnie nie możesz „zobaczyć” buforów głębokości / matryc w oczywisty sposób, a jeśli rozmiar FBO nie nie pasują do obszaru, do którego następuje blitting, metoda powiększania / zmniejszania może być bardzo naiwna.

Ale gdy pojawiają się szybkie i brudne hacki, jest całkiem nieźle.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.