我在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部分由于某种原因无法在我的桌面上执行大多数部分。
附:不使用任何中间帧缓冲器进行像素读取。
这只是一个浮点精度问题。 glReadPixels返回的值和存储在数组中的值在最后的小数位上略有不同。我通过在数组中存储int值并将glReadPixels值转换为int来修复它。