【问题标题】:glReadPixels not updating the valueglReadPixels 不更新值
【发布时间】: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) 吗?记住变换矩阵...屏幕左上角是图像原点,那么您的点是否呈现在那里?

标签: c++ c opengl graphics


【解决方案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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多