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.