문제

나는 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 카드에서 정확히 같은 문제에 반대하는 것을 기억하며 비슷한 솔루션을 채택했습니다. 오프 스크린 텍스처로 렌더링.

이것은 당신이 뷰포트 크기가 잘못된 것 같거나 비슷한 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top