2014-11-19 9 views
2

내 프레임 버퍼에서 부호없는 32 비트를 저장하고 검색하는 데 문제가 있습니다. 내 인텔 노트북 (NVIDIA 카드 및 우분투)에 프레임 버퍼의 최대 값은 다음과 같습니다 그러나부호없는 int를 읽을 때 glReadPixels의 정밀도

4.294.967.295

, 내가 읽을 수있는 최대 값, 어떤 이유로, 단지입니다 :

1.040.992.698

내가 뭔가 잘못하고 있는지 또는 내 그래픽 카드의 한계인지 누군가가 나에게 말할 수 있는지 궁금합니다.

나는이처럼 내 프레임 버퍼를 설정하고있다 :

// generate render and frame buffer objects 
    glGenRenderbuffers(1, &colorbufId); 
    glGenRenderbuffers(1, &depthbufId); 
    glGenFramebuffers (1, &framebufId); 

    // setup renderbuffer 
    glBindRenderbuffer(GL_RENDERBUFFER, colorbufId); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_R32UI, _viewWidth, _viewHeight); 

    // setup depth buffer 
    glBindRenderbuffer(GL_RENDERBUFFER, depthbufId); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32, _viewWidth, _viewHeight); 

    // setup framebuffer 
    glBindFramebuffer(GL_FRAMEBUFFER, framebufId); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorbufId); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthbufId); 

    // check if everything went well 
    GLenum stat = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
    if(stat != GL_FRAMEBUFFER_COMPLETE) { printf("stat=%d != %d\n", stat, GL_FRAMEBUFFER_COMPLETE); Error(); exit(0); } 

    // define where the framebuffer outputs will be written 
    const GLenum bufs[] = { GL_NONE, GL_COLOR_ATTACHMENT0 }; 
    glDrawBuffers(2, bufs); 

을 지금은 픽셀

const uint32_t MAX_UINT = std::numeric_limits<uint32_t>::max(); 

    glClearBufferuiv(GL_RENDERBUFFER, colorbufId, &MAX_UINT); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

    uint32_t pix_value=0; 
    glReadPixels(0, 0, 1, 1, GL_RED_INTEGER, GL_UNSIGNED_INT, &pix_value); 

에게 pix_value = 1.040.992.698의 값을 읽으려고 할 때.

또한 'GL_RED_INTEGER'대신 'GL_RED'를 사용해 보았지만 여전히 작동하지 않습니다.

EDIT (관심있는 사람들을 위해, 나는 위의 할 노력하고있어 그 이유는 따기 객체입니다) : 그래서 결국이 정밀도와는 아무 상관이 없었다. 버퍼를 올바르게 지우지 않았습니다. 셀레늄 대답 아래

답변

3

내가 발견 한 오류 확인 :

glClearBufferuiv(GL_COLOR, colorbufId, &UNDEF_IDX); 
    glClear(/*GL_COLOR_BUFFER_BIT |*/ GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
+2

올바른 명령은이 *** 정수 *** 프레임 버퍼, 그것은해야 취소 :

이 버퍼를 취소 할 수있는 올바른 명령입니다 명확히해야한다. 이것은 부동 소수점 ('glClearColor (...)') 만 정수 색 (_e.g._'glClearColorui (...)')을 설정하는 명령이 없기 때문에 필요합니다. –

+0

예, 맞습니다. – wesdec