Opengl GlunProject正在工作,然后停止工作
当我使用从opengl nvidia示例下载的glut时,该函数正在工作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
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。我认为你的思维模式中有一些东西被混淆了。