我正在尝试在我的OpenGL程序中实现一个简单的拾取方法。 首先,我用
清除模板glClearStencil(0);
在我的displayCallback函数开始时,我调用
GLbitfield mask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT;
glClear(mask);
然后我在场景中绘制所有对象,除了4个对象,我希望它是可选择的(其余的是非交互式的)。当我绘制这4个对象时,我首先启用并设置Stencil
glEnable(GL_STENCIL_TEST);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
然后绘制
glStencilFunc(GL_ALWAYS, i + 1, -1);
drawItem( ... );
其中i是项目的索引,然后调用
glDisable(GL_STENCIL_TEST);
当我尝试在用户点击左边的按钮时选择一个项目时,我在mouseCallback函数中使用它
if ((buttonPressed == GLUT_LEFT_BUTTON) && (buttonState == GLUT_DOWN)) {
unsigned char column = 0;
glReadPixels(mouseX,
(WINDOW_WIDTH - mouseY + 1),
1,
1,
GL_STENCIL_INDEX,
GL_UNSIGNED_BYTE,
&column);
if (column == 0) {
printf("Clicked at %d %d, No column clicked on\n", mouseX, mouseY);
}
else {
printf("Clicked on column with ID: %d\n", (int)column);
}
}
但无论我点击哪里,我都不会选择任何列。我甚至添加了mouseX和mouseY以检查我是否没有点击相同的像素,但我发现这部分工作正常。
有没有人发现此代码存在任何问题?非常感谢 -