2014-11-19 2 views
2

У меня возникли проблемы с сохранением и извлечением 32-битного без знака из моего фреймбуфера. Максимальное значение для фреймбуфером на моем ноутбуке интел (NVIDIA карты и Ubuntu) является:Прецизионность glReadPixels при чтении unsigned int

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' вместо 'GL_RED_INTEGER', но это все еще не работает.

(для тех, кто интересуется, почему я пытаюсь сделать выше для собирания объектов)

EDIT: Итак, в конце концов, это не имеет ничего общего с точностью. Я неправильно очищал буфер. Se ответ ниже

ответ

3

Ok я нашел ошибку:

Это правильная команда, чтобы очистить буфер:

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

Правильная команда очистить *** целое *** фреймбуфера, он должен уточнить. Обратите внимание, что это необходимо, потому что нет команды установить целочисленный прозрачный цвет (_e.g._ 'glClearColorui (...)'), только с плавающей запятой ('glClearColor (...)'). –

+0

Да, вы правы – wesdec

Смежные вопросы