Como depurar o que está sendo renderizado para um objeto de buffer de quadro no OpenGL?


17

Eu tenho uma nuvem de pontos que está sendo renderizada na tela. Cada ponto tem sua posição e cor, além de um ID.

Me pediram para renderizar os IDs de cada ponto em uma textura, então criei um FBO e anexei duas texturas, uma para cores e outra para profundidade. Criei o VAO e o VBO necessários para essa renderização fora da tela e carreguei para cada ponto sua posição e ID.

Depois que a renderização para o FBO é concluída, leio os pixels da textura de cor glReadPixels()para ver quais são os valores, mas eles parecem todos limpos, ou seja, o valor que eles têm é o mesmo que glClearColor().

Existe uma maneira de depurar o que está sendo renderizado na textura de cores do meu FBO? Todas as dicas que você pode fornecer são muito bem-vindas.

Respostas:


21

Geralmente, para ver o que está sendo renderizado nas várias etapas do seu pipeline, sugiro o uso de uma ferramenta para análise de quadros. Geralmente, eles fornecem uma visão do conteúdo de cada buffer para cada chamada de API e isso pode ajudá-lo em sua situação.

Muito bom é o Renderdoc, que é totalmente gratuito e de código aberto. Também é suportado ativamente.

Outro é o Intel GPA que, infelizmente, de acordo com sua página da Web, suporta o OGL 3.3 Core.

Apenas para adicionar mais um, eu costumava usar o gDEBugger , mas já passou muito tempo desde a última atualização. Isso evoluiu para o AMD CodeXL que, infelizmente, nunca usei.


Além disso, às vezes também tenho um comando que despeja um fbo especificado em uma imagem quando pressiono uma tecla. É a maneira de baixa tecnologia.
Jorge Rodriguez

Provavelmente, também é uma boa idéia garantir a configuração correta do teste de profundidade, para a renderização entrar no seu FBO de visualização.
rys

Ainda uso o gDEbugger de tempos em tempos para versões GL anteriores. O CodeXL é a versão mais moderna e pode ser encontrada aqui: github.com/GPUOpen-Tools/CodeXL Observe que há uma lista abrangente de ferramentas de depuração de gráficos na página apitrace aqui: apitrace.github.io/#links
Bim

11

Testei vários aplicativos / APIs / bibliotecas para obter dados de FBOs em aplicativos que usam o gbuffer, por exemplo. Após meses de sofrimento, descobri o apitrace disponível no Github para depurar o OpenGL, Direct3D e WebGL. Eu usei no Windows e Linux sem problemas.

Espero que possa ser útil para você.


7

Além da resposta do cifz, outra maneira de visualizar FBOs que não custam muito código é usar glBlitFramebuffer () para transferir pixels de um framebuffer para uma janela.

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

Existem algumas "dicas" óbvias, em que os buffers HDR provavelmente não visualizarão da maneira que você espera, provavelmente não poderá "ver" os buffers de profundidade / estêncil da maneira óbvia, e se o tamanho do FBO não Se não coincidir com a área que está sendo cortada, o método de ampliação / redução pode ser extremamente ingênuo.

Mas como hacks rápidos e sujos, é muito bom.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.