Я хочу сделать 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
, результат кажется правильным. Я не знаю, почему это идет не так, как надо, когда я использую мою сцену. Может ли кто-нибудь дать мне несколько советов? Или как сделать выбор кадра? Спасибо за вашу помощь!!
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);
...
}