Opengl 模具拾取测试始终返回0

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个对象时,我首先启用并设置

我试图在我的OpenGL程序中实现一个简单的拾取方法。 首先,我用鼠标清除模板

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
实际上是窗口的高度。我已经回滚了您的编辑。请将您的解决方案作为答案发布。