glReadPixels 不更新值

Posted

技术标签:

【中文标题】glReadPixels 不更新值【英文标题】:glReadPixels not updating the value 【发布时间】:2016-03-07 02:55:29 【问题描述】:

glReadPixels 不会在我画出一个点后立即更新。

  glColor3f(1.0f, 0.0f, 0.0f);

  glBegin(GL_POINTS);
    glVertex2f(x,y);
  glEnd();
  glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);

  printf("after coloring %d %d %d\n", (int)pixel[0], (int)pixel[1] , (int)pixel[2]);

pixel[0]pixel[1]pixel[2] 的值将为零,而预期值为 255, 0, 0。帮我解决这个问题:)

【问题讨论】:

能否显示像素类型? 像素应该是咬合类型你确定你在它的声明中得到了正确的类型吗? 您确定您的x,y 对应于屏幕(0,0) 吗?记住变换矩阵...屏幕左上角是图像原点,那么您的点是否呈现在那里? 【参考方案1】:

这可能是由于许多问题

模型到 NDC 空间的转换未设置为生成从顶点坐标到像素位置的 1:1 映射

您确实尝试设置这样的转换,但由于舍入误差和 OpenGL 像素中心有点不直观(从数学上讲,它们是有道理的),您的点最终位于相邻像素中

读取缓冲区未设置为您要绘制到的缓冲区(glDrawBuffer、glReadBuffer)

发布您的完整代码,我们能够重现并进一步帮助您。

【讨论】:

【参考方案2】:

我没有看到所有代码,但我想问题可能是你的 x 和 y 这是一个浮点值 glVertex2f(x,y); 和 x 和 y 小于 1 但 glReadPixels 使用 int 参数并在从float 到 int 它从我们想要读取的信息中获取不正确的像素坐标值,因此如果您想使用真实像素坐标,您可以使用 glOrtho(更多信息可以在 here 中找到)例如窗口高度 = 500 和宽度 = 500:

void Display(void) 
        glClear(GL_COLOR_BUFFER_BIT);
        //Rectangles();
        glMatrixMode(GL_PROJECTION);
        glOrtho(0, 500, 0, 500, -1, 1); 
      // Restore the default matrix mode
        glColor3f(1.0f, 0.0f, 0.0f);
        float x = 50, y = 50;
        unsigned char pixel[3];
        glBegin(GL_POINTS);
          glVertex2f(x,y);
        glEnd();
        glMatrixMode(GL_MODELVIEW);
        glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);

        printf("after coloring %d %d %d\n", (int)pixel[0], (int)pixel[1] , (int)pixel[2]);
        glFlush();
    

【讨论】:

以上是关于glReadPixels 不更新值的主要内容,如果未能解决你的问题,请参考以下文章

glReadPixels 移动坐标与缩放

整个窗口的 glReadPixels (OpenGL)

opengl glReadPixels

glReadPixels 与屏幕像素

glReadPixels 不适用于 GL_FLOAT

glReadPixels 的 OpenGL DSA 等效项