【问题标题】:glReadPixels() is not accurateglReadPixels() 不准确
【发布时间】:2021-07-28 12:30:20
【问题描述】:

我想根据颜色进行鼠标选择。这是我的代码:

bool Geometry::IsObjectClicked(int x, int y, float color[4])
{
   glFlush();
   glFinish();
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
   struct { GLubyte red, green, blue; } pixel;
   glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixel);
   float clickedColor[3];
   clickedColor[0] = (float)((float)pixel.red / 255);
   clickedColor[1] = (float)((float)pixel.green / 255);
   clickedColor[2] = (float)((float)pixel.blue / 255);
   if (clickedColor[0] == color[0] && clickedColor[1] == color[1] && clickedColor[2] == color[2])
   {
       return true;
   }
   return false;
}

我有不同颜色的三角形。 当我点击三角形的中心时,它给了我正确的行为,但是当我点击三角形的其他地方时,它不会将该像素识别为颜色。有时它甚至无法识别一些带有不直接代码(如 rgb(255, 0, 0))的极端颜色。我认为也许我的 x 和 y 坐标不正确,但我认为 glfwGetCursorPos() 工作正常。

【问题讨论】:

  • 在 OpenGL 中 (0, 0) 是视口的底部。将y坐标改为height - yheight是窗口的高度)

标签: c++ opengl glfw mouse-picking


【解决方案1】:

第一个评论者是对的,您必须将 y 更改为 height-y。 至于颜色比较,我注意到两种颜色之间存在细微差别,这使得比较错误。所以我加了一个 0.01f 的容差:

if ((clickedColor[0] == color[0] || abs(clickedColor[0]-color[0]) < 0.01f) && (clickedColor[1] == color[1] || abs(clickedColor[1] - color[1]) < 0.01f) && (clickedColor[2] == color[2] || abs(clickedColor[2] - color[2]) < 0.01f))
{
    return true;
}

【讨论】:

  • 关于“0.01f 容差”,请参阅Is floating point math broken?。但是为什么要转换为浮点数呢?只需将像素值作为GL_UNSIGNED_BYTE color[4] 提供给调用者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多