opengl glReadPixel返回错误结果

l7wslrjt  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(152)

我想在OpenGl上用帧拾取的方式进行3D拾取,在这种方式下我需要使用glReadPixel来获取当前屏幕上像素的一些信息,所以我用下面的方法进行测试,但是得到了错误的结果。首先,我使用回调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)。图片如下。
the return result is (0.4,0.0,0.6) but the right result shoud be (1.0,0.0,0.0)
the return result is (0.0,0.0,0.1) but the right result shoud be (0.4,0.0,0.6)
the return result is (0.8,0.0,0.2) but the right result shoud be (0.4,0.0,0.6)
我试着用简单的例子(画一个三角形)来测试glReadPixel,结果似乎是正确的。我不知道为什么在使用我的场景时会出错。有人能给予我一些建议吗?或者如何做帧拾取?谢谢你的帮助!!

umuewwlo

umuewwlo1#

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

相关问题