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

问题描述 投票:-1回答:1

我在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部分由于某种原因无法在我的桌面上执行大多数部分。

附:不使用任何中间帧缓冲器进行像素读取。

c++ opengl glm-math
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.