2

我正在为我的一个班级项目制作一个游戏,实际上是 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 值。

可能是什么问题呢?

4

1 回答 1

2

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

于 2011-01-15T21:09:16.520 回答