GlReadPixel возвращает результат ошибки

Я хочу сделать 3D-выбор на OpenGl путем выбора кадра. Таким образом, мне нужно использовать glReadPixel, чтобы получить некоторую информацию о пикселях на экране в данный момент, поэтому я проверяю это следующим образом, но получаю неправильный результат. Во-первых, я использую Callback glfwSetCursorPosCallback(window, mouse_callback) и mouse_callback(GLFWwindow* window, double xpos, double ypos), чтобы получить текущее положение мыши (положение экрана) и цвет пикселя (когда я меняю положение мыши), затем использую std::cout для его печати.

void mouse_callback(GLFWwindow* window, double xpos, double ypos)   
{
    uint32_t color;
    glm::vec4 c;
    GLfloat stencil;
    glReadPixels(xpos, ypos, 1, 1,GL_RGBA, GL_UNSIGNED_BYTE, &color);
    c.r = (color & 0xFF) / 255.0F;
    c.g = ((color >> 8) & 0xFF) / 255.0F;
    c.b = ((color >> 16) & 0xFF) / 255.0F;
    c.a = ((color >> 24) & 0xFF) / 255.0F;
    std::cout << "color[0]" << c.r<< std::endl;
    std::cout << "color[1]" << c.g << std::endl;
    std::cout << "color[2]" << c.b << std::endl;
    std::cout << "color[3]" << c.a << std::endl;
}

Но проблема в том, что когда я визуализирую сцену ниже и навожу мышь на другую часть этой сцены, результат кажется неправильным. От левой верхней области до правой нижней области RBG должен быть (1,0,0,0,0,0), (0,6,0,0,0,4), (0,4,0,0,0,6), (0,2,0,0,0,8), (0,0 ,0.0,1.0). Фотографии ниже.

возвращаемый результат (0.4,0.0,0.6), но правильный результат должен быть (1.0,0.0,0.0)

возвращаемый результат (0.0,0.0,0.1), но правильный результат должен быть (0.4,0.0,0.6)

возвращаемый результат (0.8,0.0,0.2), но правильный результат должен быть (0.4,0.0,0.6)

Я попытался использовать простые примеры (нарисовать треугольник), чтобы проверить glReadPixel, результат кажется правильным. Я не знаю, почему это идет не так, как надо, когда я использую мою сцену. Может ли кто-нибудь дать мне несколько советов? Или как сделать выбор кадра? Спасибо за вашу помощь!!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

OpenGL использует координаты, где начало координат (0, 0) находится в левом нижнем углу окна, а +Y вверху. Вы должны преобразовать в систему координат OpenGL при чтении, так как события курсора используют (0, 0) в качестве верхнего левого угла окна, а +Y находится внизу.

void mouse_callback(GLFWwindow* window, double xpos, double ypos)
{
    int width, height;
    glfwGetWindowSize(window, &width, &height);
    int ixpos = (int)xpos;
    int iypos = height - 1 - (int)ypos;
    uint32_t color;
    glReadPixels(ixpos, iypos, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &color);
    ...
}

Другие вопросы по теме