OpenGL에서 프레임 버퍼 객체로 렌더링되는 것을 어떻게 디버깅 할 수 있습니까?


17

화면에 렌더링되는 포인트 클라우드가 있습니다. 각 지점에는 ID뿐만 아니라 위치와 색상이 있습니다.

각 점의 ID를 텍스처로 렌더링하라는 요청을 받았으므로 FBO를 만들고 하나는 색상과 하나는 깊이에 대한 두 개의 텍스처를 첨부했습니다. 이 오프 스크린 렌더링에 필요한 VAO 및 VBO를 만들고 각 지점마다 위치와 ID를 업로드했습니다.

FBO에 대한 렌더링이 완료되면 색상 질감의 픽셀을 읽어 glReadPixels()값이 무엇인지 확인하지만 모두 지워진 것처럼 보입니다. 즉, 값이와 같습니다 glClearColor().

FBO의 색상 질감으로 렌더링되는 내용을 디버깅 할 수있는 방법이 있습니까? 당신이 제공 할 수있는 모든 팁을 환영합니다.

답변:


21

일반적으로 파이프 라인의 다양한 단계에서 렌더링되는 내용을 보려면 프레임 분석 도구를 사용하는 것이 좋습니다. 일반적으로 각 API 호출에 대한 각 버퍼의 내용을 볼 수 있으며 상황에 도움이 될 수 있습니다.

아주 좋은 것은 완전히 무료이며 오픈 소스 인 Renderdoc 입니다. 또한 적극적으로 지원됩니다.

또 다른 하나는 불행히도 웹 페이지에 따르면 최대 OGL 3.3 코어를 지원하는 Intel GPA 입니다.

하나 이상을 추가하기 위해 gDEBugger 를 사용 했지만 마지막 업데이트 이후 오랫동안 사용되었습니다. 불행히도 나는 결코 사용하지 않은 AMD CodeXL 로 발전했습니다 .


또한 때로는 키를 누를 때 지정된 fbo를 이미지에 덤프하는 명령이 있습니다. 최첨단 기술입니다.
— Jorge Rodriguez

또한 시각화 FBO로 렌더링하기 위해 올바른 깊이 테스트 설정을 수행하는 것이 좋습니다.
— rys

이전 GL 버전에서는 때때로 gDEbugger를 사용합니다. CodeXL은 최신 버전이며 여기에서 찾을 수 있습니다. github.com/GPUOpen-Tools/CodeXL 여기 apitrace 페이지에 포괄적 인 그래픽 디버깅 도구 목록이 있습니다. apitrace.github.io/#links
— Bim

11

예를 들어 gbuffer를 사용하는 응용 프로그램의 FBO에서 데이터를 가져 오기 위해 여러 응용 프로그램 / API / 라이브러리를 테스트했습니다. 몇 개월의 고통 끝에 OpenGL, Direct3D 및 WebGL을 디버깅하기 위해 Github에서 사용할 수있는 apitrace를 발견 했습니다 . Windows와 Linux에서 문제없이 사용했습니다.

도움이 되길 바랍니다.


7

cifz의 응답 외에도 많은 비용이 들지 않는 FBO를 시각화하는 또 다른 방법은 glBlitFramebuffer ()를 사용하여 픽셀을 프레임 버퍼에서 윈도우로 전송하는 것입니다.

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

HDR 버퍼가 예상 한 방식을 시각화하지 못할 수도 있고, 깊이 / 스텐실 버퍼를 명백한 방식으로 "볼"수 없으며, FBO의 크기가 폭파되는 영역과 일치하지 않으면 확대 / 축소 방법이 매우 순진 할 수 있습니다.

그러나 빠른 해킹이 진행되면 꽤 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.