Opengl 模具拾取测试始终返回0
我试图在我的OpenGL程序中实现一个简单的拾取方法。 首先,我用鼠标清除模板Opengl 模具拾取测试始终返回0,opengl,glreadpixels,Opengl,Glreadpixels,我试图在我的OpenGL程序中实现一个简单的拾取方法。 首先,我用鼠标清除模板 glClearStencil(0); 在displayCallback函数的开始,我调用 GLbitfield mask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; glClear(mask); 然后,我绘制场景中的所有对象,除了4个对象,我希望它们是可选择的(其余是非交互式的)。当我绘制这4个对象时,我首先启用并设置
glClearStencil(0);
在displayCallback函数的开始,我调用
GLbitfield mask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT;
glClear(mask);
然后,我绘制场景中的所有对象,除了4个对象,我希望它们是可选择的(其余是非交互式的)。当我绘制这4个对象时,我首先启用并设置模具
glEnable(GL_STENCIL_TEST);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
然后画
glStencilFunc(GL_ALWAYS, i + 1, -1);
drawItem( ... );
其中i是项的索引,然后调用
glDisable(GL_STENCIL_TEST);
当我试图在用户单击左mosue按钮时选择一个项目时,我会在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来检查我是否没有点击相同的像素,但我发现这部分工作正常
有人看到这个代码有什么问题吗?非常感谢-您是否记得在调用
glutInitDisplayMode
时使用GLUT\u模具
位来分配模具缓冲区?我记得,但感谢您指出这一点。我目前正在使用glutInitDisplayMode(GLUT|U RGB | GLUT|U DOUBLE | GLUT|U深度| GLUT|U模具);如果你能把它浓缩成一个简单的句子,那就太好了。基本上,只要在一个已知的位置画一个简单的东西并启用模板,然后将模板读回。这应该是您编写的准确模具值。可能不是您唯一的问题,而是从WINDOW\u WIDTH
中减去mouseY
看起来可疑。除非WINDOW\u WIDTH
实际上是窗口的高度。我已经回滚了您的编辑。请将您的解决方案作为答案发布。您是否记得在调用glutInitDisplayMode
时使用GLUT\u模具
位来分配模具缓冲区?我已经分配了,但感谢您指出这一点。我目前正在使用glutInitDisplayMode(GLUT|U RGB | GLUT|U DOUBLE | GLUT|U深度| GLUT|U模具);如果你能把它浓缩成一个简单的句子,那就太好了。基本上,只要在一个已知的位置画一个简单的东西并启用模板,然后将模板读回。这应该是您编写的准确模具值。可能不是您唯一的问题,而是从WINDOW\u WIDTH
中减去mouseY
看起来可疑。除非WINDOW\u WIDTH
实际上是窗口的高度。我已经回滚了您的编辑。请将您的解决方案作为答案发布。