У меня проблемы с хранением и извлечением 32-битных беззнаковых файлов из моего фреймбуфера. Максимальное значение буфера кадра на моем ноутбуке Intel (карта nvidia и Ubuntu):
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», но это все равно не работает.
(для всех, кто заинтересован, я пытаюсь сделать это для выбора объектов)
РЕДАКТИРОВАТЬ: Так что, в конце концов, это не имело ничего общего с точностью. Я не очищал буфер правильно. Смотрите ответ ниже