我正在opengl中制作象棋,作为一种学习练习。我的想法是使用glReadPixels进行对象拾取(在我的情况下是棋子)。但是,该代码似乎只能在笔记本电脑上正常工作,而不能在台式机上正常工作。
在进行实际运动之前,我先设置了对象的简单轮廓。
我有一个鼠标类,该类计算鼠标位置并返回鼠标位置的像素颜色。
每个零件都有一个类,其中为每个零件生成随机的颜色和位置,并将它们存储在位置和颜色数组中。
我有一个游戏类,该类调用鼠标类函数以在鼠标位置获取颜色。然后,它将这个颜色值与存储在每块数组中的颜色进行比较。只要颜色匹配,它就会使用index参数调用该类的handleHit函数。它使用此索引从位置数组确定作品的位置,并因此进行概述。
Mouse Class :
static void calcMousePos(GLFWwindow* window)
{
int width, height;
double x, y;
glfwGetWindowSize(window, &width, &height);
glfwGetCursorPos(window, &x, &y);
position.x = x;
position.y = y;
}
static glm::vec3 getPixelColorUnderMouse(GLFWwindow* window)
{
calcMousePos(window);
float data[3];
glReadPixels(position.x, SCR_HEIGHT - position.y, 1, 1, GL_RGB, GL_FLOAT, data);
glm::vec3 color;
color.r = data[0];
color.g = data[1];
color.b = data[2];
std::cout << color.r << " " << color.g << " " << color.b << std::endl;
return color;
}
Game Class:
void checkObjectWithCurrentColor(const glm::vec3 &color)
{
for (int i = 0; i < 16; i++)
{
if (color == pawn->getPawnColor(i))
{
pawn->handleHit(i);
break;
}
if (i < 4)
{
if (color == rook->getRookColor(i))
{
rook->handleHit(i);
break;
}
else if (color == knight->getKnightColor(i))
{
knight->handleHit(i);
break;
}
else if (color == bishop->getBishopColor(i))
{
bishop->handleHit(i);
break;
}
}
if (i < 2)
{
if (color == queen->getQueenColor(i))
{
queen->handleHit(i);
break;
}
else if (color == king->getKingColor(i))
{
king->handleHit(i);
break;
}
}
}
}
当我在笔记本电脑中执行程序但在桌面上无法正常工作时,这段代码为我提供了所有代码的正确概述。在某些方面确实概述了,但在其他方面则没有。轮廓也会根据窗口位置而变化。我尝试输出我的作品的颜色值和鼠标位置的颜色值。它们都匹配,但是由于某些原因,checkObjectWithCurrentColor()的if else部分无法在我的桌面上执行大部分操作。
P.S。不使用任何中间帧缓冲区进行像素读取。
答案 0 :(得分:0)
这只是一个浮点精度问题。 glReadPixels返回的值和存储在数组中的值在最后的小数位略有不同。我通过将int值存储在数组中并将glReadPixels值转换为int来修复它。