문제를 저장하는 OpenGL FBO가 창보다 큽니다
-
22-08-2019 - |
문제
나는 OpenGL 오프 스크린 프레임 버퍼 객체를 렌더링하고 이미지로 저장하는 것을 좋아합니다. 주목하십시오 FBO 디스플레이 크기보다 큽니다. 오프 스크린 버퍼로 렌더링하여 텍스처로 사용할 수 있습니다. 오프셋을 사용하여 디스플레이를 통해이 큰 텍스처를 "스크롤"할 수 있습니다. 따라서 창보다 더 큰 컨텍스트로 렌더링 할 수 있다고 확신합니다.
오프 스크린 버퍼를 이미지 파일에 저장하면 항상 자르고 있습니다. 저장을위한 코드 조각은 다음과 같습니다.
void ofFBOTexture::saveImage(string fileName) {
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
// get the raw buffer from ofImage
unsigned char* pixels = imageSaver.getPixels();
glReadPixels(0, 0, 1024, 1024, GL_RGB, GL_UNSIGNED_BYTE, pixels);
imageSaver.saveImage(fileName);
}
이미지 컨텐츠가 자르고 보이는 부분이 올바르게 저장됩니다 (픽셀 형식, GL_RGB 문제 등에 오류가 없음을 의미하지만 나머지 공간에는 하나의 색상으로 채워집니다.
그래서 내 질문은 - 내가 뭘 잘못하고 있는가?
해결책
마침내 나는 문제를 해결했다.
내용을 저장하려면 FBO를 활성화해야합니다.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
// save code
...
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
FBO 만 선택하는 동안 glReadPixels
~을 통해
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
충분하지 않습니다.
(예 : 뷰포트 크기, 버퍼의 너비 및 높이, 이미지 텍스처 등의 기타 모든 것들)
다른 팁
시작해야 할 두 가지 질문 : ImagesAver를 어떻게 만들고 있습니까? 너비와 높이가 정확하다고 확신합니까 (예 : 1024 x 1024 이미지를 저장하려고합니까? 어떤 크기를 얻고 있습니까?)?
당신은 잘못된 일을하지 않습니다. 이것은 OpenGL 그래픽 드라이버와 오랫동안 일반적인 행동이었습니다. 저는 적어도 10 년 전에 NVIDIA GeForce 3 카드에서 정확히 같은 문제에 반대하는 것을 기억하며 비슷한 솔루션을 채택했습니다. 오프 스크린 텍스처로 렌더링.
이것은 당신이 뷰포트 크기가 잘못된 것 같거나 비슷한 것 같습니다.