Точность glReadPixels при чтении беззнакового целого

У меня проблемы с хранением и извлечением 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», но это все равно не работает.

(для всех, кто заинтересован, я пытаюсь сделать это для выбора объектов)

РЕДАКТИРОВАТЬ: Так что, в конце концов, это не имело ничего общего с точностью. Я не очищал буфер правильно. Смотрите ответ ниже


person wesdec    schedule 19.11.2014    source источник


Ответы (1)


Хорошо, я нашел ошибку:

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

  glClearBufferuiv(GL_COLOR, colorbufId, &UNDEF_IDX);
  glClear( /*GL_COLOR_BUFFER_BIT |*/ GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
person wesdec    schedule 19.11.2014
comment
Правильная команда для очистки целочисленного фреймбуфера, ее следует уточнить. Обратите внимание, что это необходимо, потому что нет команды для установки целочисленного чистого цвета (например, glClearColorui(...)), только с плавающей запятой (glClearColor (...)). - person Andon M. Coleman; 19.11.2014