C++ OpenGL中的颜色编码拣选问题

C++ OpenGL中的颜色编码拣选问题,c++,opengl,picking,mouse-picking,C++,Opengl,Picking,Mouse Picking,我正在为我的一个班级项目制作一个游戏,实际上是Minecraft的一个非常基本的复制品。我现在被困在拾取过程中,这将使我能够在游戏环境中销毁和创建块 我一直在尝试使用OpenGL自己的拾取模式,但没有任何成功,对于这样一个规模的项目来说,使用数学库构建自己的光线拾取器似乎是一项艰巨的工作。因此,我决定使用颜色编码的拾取方法,它包括以不同的颜色渲染每个可拾取的对象,然后在鼠标位置获取颜色,并使用它来识别拾取的对象 我目前的界面只是一个三维渲染的许多方块堆叠,创造一个地形一样的结构。因为我还没有做纹

我正在为我的一个班级项目制作一个游戏,实际上是Minecraft的一个非常基本的复制品。我现在被困在拾取过程中,这将使我能够在游戏环境中销毁和创建块

我一直在尝试使用OpenGL自己的拾取模式,但没有任何成功,对于这样一个规模的项目来说,使用数学库构建自己的光线拾取器似乎是一项艰巨的工作。因此,我决定使用颜色编码的拾取方法,它包括以不同的颜色渲染每个可拾取的对象,然后在鼠标位置获取颜色,并使用它来识别拾取的对象

我目前的界面只是一个三维渲染的许多方块堆叠,创造一个地形一样的结构。因为我还没有做纹理贴图,所以所有的框都是灰色(启用了照明)

现在,我们来看一些实际的代码:

这是初始化部分,启用纹理、照明等

glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
单击鼠标按钮时,我尝试通过以下方式获取鼠标光标位置的颜色(实际上始终位于窗口的中间):

问题是,禁用不起作用,我总是在我的
像素
数组中获得不同灰度的RGB值


可能是什么问题?

也许您忘记了清除颜色缓冲区和禁用深度缓冲区,并且所有渲染的颜色都会导致Z-Fighting或根本不渲染(如果Z-test为“less”)。尝试添加swapbuffers代码,并查看在ColorRender代码之后渲染的内容

glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);   
glDisable(GL_DITHER);
glDisable(GL_LIGHT0);
glDisable(GL_LIGHT1);
    renderColors();
    GLubyte pixels[3];
    glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, (void *)pixels); 
glEnable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
glEnable(GL_DITHER);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);