glReadPixels() 不准确
glReadPixels() is not accurate
我想根据颜色进行鼠标拾取。这是我的代码:
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()
工作正常。
第一个评论说的对,你要把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;
}
我想根据颜色进行鼠标拾取。这是我的代码:
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()
工作正常。
第一个评论说的对,你要把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;
}