Почему моя программа glReadPixels не работает на другом компьютере? - PullRequest
0 голосов
/ 16 февраля 2019

Я занимаюсь шахматами в opengl в качестве учебного упражнения.Моя идея - использовать glReadPixels для выбора объектов (в моем случае это шахматные фигуры).Однако кажется, что код работает правильно только на моем ноутбуке, а не на рабочем столе.

Перед тем, как приступить к реальному движению, я настроил простую схему объекта.

У меня есть класс мыши, который вычисляет положение мыши и возвращает цвет пикселя в месте расположения мыши.

У меня есть класс для каждой фигуры, где я генерирую случайный цвет и позицию для каждой фигуры и сохраняю их в позициях и цветовых массивах.

У меня есть класс игры, который вызывает функцию класса мыши, чтобы получить цвет в месте расположения мыши.Затем он сравнивает это значение цвета с цветами, хранящимися в массивах каждого куска.Везде, где цвет совпадает, он вызывает функцию handleHit этого класса с аргументом index.Он использует этот индекс, чтобы определить положение фрагмента из массива позиции и, соответственно, выполняет выделение.

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;
            }
        }
    }
}

Этот фрагмент кода дает мне правильное наложение на все фрагменты при выполнении программы на моем ноутбуке, но работаетхаотично на моем рабочем столе.На некоторых частях это делает обрисовку в общих чертах, но на других это не делает.Контур также меняется в зависимости от положения окна.Я попытался вывести значения цвета моих частей и значения цвета на месте мыши.Они оба совпадают, но if else часть checkObjectWithCurrentColor () по некоторым причинам не может быть выполнена на моем рабочем столе для большинства частей.

PS Не используется промежуточный кадровый буфер для чтения пикселей.

1 Ответ

0 голосов
/ 16 февраля 2019

Это была просто проблема точности с плавающей точкой.Значения, возвращаемые glReadPixels, и значения, хранящиеся в массивах, незначительно отличались в последних десятичных разрядах.Я исправил это, сохранив значения int в массивах, а также преобразовав значения glReadPixels в int.

...