У меня возникли проблемы с сохранением и извлечением 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 ответ ниже
Правильная команда очистить *** целое *** фреймбуфера, он должен уточнить. Обратите внимание, что это необходимо, потому что нет команды установить целочисленный прозрачный цвет (_e.g._ 'glClearColorui (...)'), только с плавающей запятой ('glClearColor (...)'). –
Да, вы правы – wesdec