OpenGL中的颜色编码拾取问题

时间:2010-12-28 23:25:18

标签: c++ opengl picking mouse-picking

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

我一直在尝试使用OpenGL自己的选择模式而没有任何成功,并且使用数学库构建我自己的光线选择器对于这样大小的项目来说似乎很大。所以,我决定使用颜色编码的拾取方法,它包括以不同颜色渲染每个可拾取对象,然后将颜色放在鼠标位置并使用它来识别拾取的对象。

我当前的界面只是堆叠的许多盒子的3D渲染,创建了一个类似地形的结构。由于我还没有完成纹理贴图,所有的框都是灰色阴影(启用了照明)。

现在,一些实际代码的时间:

这是初始化部分,可以实现纹理,照明等。

glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);

单击鼠标按钮时,我尝试通过以下方式获取鼠标光标位置的颜色(实际上始终是窗口的中间位置):

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

问题是,禁用功能不起作用,我总是在pixels数组中获得不同灰度的RGB值。

可能是什么问题?

1 个答案:

答案 0 :(得分:2)

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