¿Cómo puedo depurar lo que se está representando en un objeto Frame Buffer en OpenGL?

17

Tengo una nube de puntos que se muestra en la pantalla. Cada punto tiene su posición y color, así como una identificación.

Me pidieron que representara las ID de cada punto en una textura, así que creé un FBO y adjunté dos texturas, una para el color y otra para la profundidad. Creé el VAO y VBO necesarios para esta representación fuera de la pantalla y cargué para cada punto su posición e ID.

Una vez que se realiza el renderizado al FBO, leo los píxeles de la textura de color glReadPixels()para ver cuáles son los valores, pero parece que se borran todos, es decir, el valor que tienen es el mismo glClearColor().

¿Hay alguna forma de depurar lo que se procesa en la textura de color de mi FBO? Cualquier sugerencia que pueda proporcionar es muy bienvenida.

BRabbit27
fuente

Respuestas:

21

En general, para ver qué se representa en los distintos pasos de su canalización, sugiero el uso de una herramienta para el análisis de cuadros. Estos generalmente le brindan una vista del contenido de cada búfer para cada llamada API y esto puede ayudarlo en su situación.

Uno muy bueno es Renderdoc, que es completamente gratuito y de código abierto. También se apoya activamente.

Otro es Intel GPA que desafortunadamente, de acuerdo con su página web, admite hasta OGL 3.3 Core.

Solo por agregar uno más, solía usar gDEBugger , pero ha pasado mucho tiempo desde la última actualización. Esto se ha convertido en AMD CodeXL que desafortunadamente nunca usé.

cifz
fuente
Además, a veces también tengo un comando que volcará un fbo especificado en una imagen cuando presiono una tecla. Es la forma de baja tecnología.
Jorge Rodriguez
Probablemente también sea una buena idea asegurarse de tener la configuración de prueba de profundidad correcta, para que el renderizado entre en su visualización FBO.
rys
Todavía uso gDEbugger de vez en cuando para versiones anteriores de GL. CodeXL es la versión más moderna y se puede encontrar aquí: github.com/GPUOpen-Tools/CodeXL Tenga en cuenta que hay una lista completa de herramientas de depuración de gráficos en la página de apitrace aquí: apitrace.github.io/#links
Bim
11

Probé varias aplicaciones / API / bibliotecas para obtener datos de FBO en aplicaciones que usan gbuffer, por ejemplo. Después de meses de sufrimiento descubrí una apática disponible en Github para depurar OpenGL, Direct3D y WebGL. Utilicé en Windows y Linux sin problemas.

Espero que te sea útil.

esmitt
fuente
7

Además de la respuesta de cifz, otra forma de visualizar FBO que no cuesta mucho código es usar glBlitFramebuffer () para transferir píxeles de un framebuffer a una ventana.

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

Hay algunas "trampas" obvias, en el sentido de que los buffers HDR probablemente no visualizarán la forma en que espera que lo hagan, probablemente no pueda "ver" los buffers de profundidad / plantilla de la manera obvia, y si el tamaño del FBO no Si no coincide con el área que se está desplazando, el método de aumento / minificación podría ser extremadamente ingenuo.

Pero a medida que avanzan los trucos rápidos y sucios, es bastante bueno.

Seudónimo
fuente