为什么我的glReadPixels程序不能在另一台计算机上运行?

时间:2019-02-16 07:46:01

标签: c++ opengl glm-math

我正在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。不使用任何中间帧缓冲区进行像素读取。

1 个答案:

答案 0 :(得分:0)

这只是一个浮点精度问题。 glReadPixels返回的值和存储在数组中的值在最后的小数位略有不同。我通过将int值存储在数组中并将glReadPixels值转换为int来修复它。