Opengl 读取无符号整数时glReadPixels的精度

Opengl 读取无符号整数时glReadPixels的精度,opengl,opengl-3,opengl-4,Opengl,Opengl 3,Opengl 4,我在从帧缓冲区存储和检索32位无符号时遇到问题。我的英特尔笔记本电脑(nvidia卡和Ubuntu)上帧缓冲区的最大值为: 4.294.967.295 但是,出于某种原因,我可以读取的最大值仅为: 1.040.992.698 我想知道是否有人能告诉我我是否做错了什么,或者这是否是我的图形卡的一个限制 我正在设置帧缓冲区,如下所示: // generate render and frame buffer objects glGenRenderbuffers( 1, &colorbu

我在从帧缓冲区存储和检索32位无符号时遇到问题。我的英特尔笔记本电脑(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);
const uint32\u t MAX\u UINT=std::numeric\u limits::MAX();
glClearBufferuiv(GL_RENDERBUFFER、colorbufId和MAX_UINT);
glClear(GL|U颜色|U缓冲|位| GL|U深度|U缓冲|位| GL|U模具|U缓冲|位);
uint32_t pix_值=0;
glReadPixels(0、0、1、1、GL\u RED\u INTEGER、GL\u UNSIGNED\u INT和pix\u value);
pix_值的值=1.040.992.698

我还尝试使用“GL_RED”而不是“GL_RED_INTEGER”,但仍然不起作用

(对于任何感兴趣的人,我尝试执行上述操作的原因是为了拾取对象)

编辑:所以最终这与精度无关。我没有正确清除缓冲区。请回答以下问题

好的,我发现了错误:

这是清除缓冲区的正确命令:

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

清除整数帧缓冲区的正确命令,应予以澄清。请注意,这是必要的,因为没有设置整数清除颜色的命令(例如,
glClearColorui(…)
),只有浮点(
glClearColor(…)
)。