Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl GlunProject正在工作,然后停止工作_Opengl_Glut_Freeglut - Fatal编程技术网

Opengl GlunProject正在工作,然后停止工作

Opengl GlunProject正在工作,然后停止工作,opengl,glut,freeglut,Opengl,Glut,Freeglut,当我使用从opengl nvidia示例下载的glut时,该函数正在工作 void gl_select(int x, int y) { GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; GLfloat winX, winY, winZ; GLdouble posX, posY, posZ; glGetDoublev(GL_MODELVIEW_MATRIX, mo

当我使用从opengl nvidia示例下载的glut时,该函数正在工作

void gl_select(int x, int y)
{
    GLint viewport[4];
    GLdouble modelview[16];
    GLdouble projection[16];
    GLfloat winX, winY, winZ;
    GLdouble posX, posY, posZ;

    glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
    glGetDoublev(GL_PROJECTION_MATRIX, projection);
    glGetIntegerv(GL_VIEWPORT, viewport);

    winX = (float)x;
    winY = (float)viewport[3] - (float)y;
    glReadPixels(x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

    gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);


    printf("%f %f %f\n", posX, posZ, posY);

    glutPostRedisplay();
}

但后来我切换到免费过量,现在它不工作了,有人能告诉我为什么吗?

好的,我想我可以猜到你的问题:你可能是从输入事件处理程序调用
gl\u select
。现在是这样的:当你从主帧缓冲区读取像素时,你可能永远不会得到任何合理的值。为什么?因为操作系统可能会决定“呃,那部分无论如何都不可见,那么为什么还要费心处理它呢”(这称为像素所有权测试)。此外,主帧缓冲区的内容可能随时丢失(损坏事件)

好的,然后
glReadPixels
从选择读取的帧缓冲区读取。如果这是后缓冲区,并且您在缓冲区交换后访问它,则内容也未定义(对于颜色)。帧缓冲区的深度组件也会因交换而损坏

因此,如果
glReadPixels
如此不可靠,您可能会想,如何使用它?嗯,并不是
glReadPixels
那么不可靠,只是窗口帧缓冲区不稳定。所以你不应该用那个。相反,如果要进行像素空间深度选择,应首先渲染到FBO,然后将其复制到主窗口帧缓冲区。FBO的内容被断言不会丢失。所以你可以在任何时候从FBO那里阅读,确保你得到了你想要的


此外,在调用
gl\u select
时,不应依赖矩阵堆栈中的内容。相反,您应该在显示代码中创建投影和modelview矩阵的快照副本,其状态表示应用于选择的转换。

GLUT=/=GLUT=/=OpenGL。我认为你的思维模式中有一些东西被混淆了。