C++ glReadPixels深度\缓冲区\组件始终返回1

C++ glReadPixels深度\缓冲区\组件始终返回1,c++,visual-studio,opengl,glut,glreadpixels,C++,Visual Studio,Opengl,Glut,Glreadpixels,我试图从OpenGL窗口中的任何渲染顶点获取世界坐标(我更喜欢使用GLUT库)。问题是,当我调用glReadPixels函数获取顶点的深度值时,当我在任何地方单击鼠标时,它总是返回1值 我被困在这一点上,已经读了很多文章,但没有得到任何答案 这是我的代码: 显示功能 主要功能 鼠标点击功能 void鼠标(int按钮、int状态、int x、int y){ GLdouble-objX,objY,objZ; GLdouble matModelView[16],matProjection[16]; 闪

我试图从OpenGL窗口中的任何渲染顶点获取世界坐标(我更喜欢使用GLUT库)。问题是,当我调用
glReadPixels
函数获取顶点的深度值时,当我在任何地方单击鼠标时,它总是返回1值

我被困在这一点上,已经读了很多文章,但没有得到任何答案

这是我的代码:

显示功能

主要功能

鼠标点击功能

void鼠标(int按钮、int状态、int x、int y){
GLdouble-objX,objY,objZ;
GLdouble matModelView[16],matProjection[16];
闪烁视口[4];
glGetDoublev(GL_模型视图_矩阵,matModelView);
glGetDoublev(GL_投影矩阵,matProjection);
glGetIntegerv(GL_视口,视口);
glx=x;
GLfloat winY=视口[3]-y;
GLfloat-winZ=0;
glReadPixels(winX、winY、1、1、GL_深度分量、GL_浮点和winZ);

您是否尝试过将GLUT\u深度传递到glutInitDisplayMode

根据GLUT文档,创建深度缓冲区需要使用该标志。

要使用的参数必须是单个枚举数常量。该参数不是位字段

以下内容无效,将生成
GL\u INVALID\u ENUM
错误,可由或检测到:

一定是这样

glEnable(GL_深度_测试);
无论如何,
GL\u DEPTH
不是
glEnable
的有效参数,但它可能是的参数。
请注意,枚举器常量
GL_DEPTH_TEST
的值为
0x0B71
,而
GL_DEPTH
的值为
0x1801
。这两个常量的二进制或(
)操作没有任何意义

因此,从未启用,也没有向深度缓冲区写入任何内容


进一步注意,深度范围接受的值必须在[0,1]范围内。传递到
gldeptrange
的值在接受之前都被钳制在该范围内

这就是说,

等于

gldeptrange(1,1);
所以深度范围是[1,1],并且返回的所有值也是1

跳过
gldepsrange(2002000);
以解决此问题


glGetDoublev(GL\u MODELVIEW\u MATRIX,matModelView)
GL\u MODELVIEW
矩阵堆栈获取当前模型视图矩阵。
glGetDoublev(GL\u PROJECTION\u MATRIX,matProjection)
GL\u PROJECTION
矩阵堆栈获取当前投影矩阵

因此,您应该将投影矩阵放在
GL\u投影
矩阵堆栈上,将视图矩阵放在
GL\u模型视图
矩阵堆栈上(请参阅):

glMatrixMode(GL_投影);
glLoadIdentity();
glFrustum(-150150,-1501502002000);
glMatrixMode(GLU模型视图);
glLoadIdentity();
gluLookAt(200400200,0,0.0,0.0,0.0,0.0,1.0);

谢谢你的建议,不幸的是一切都没有改变。你是谁?
void display(){

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glEnable(GL_DEPTH | GL_DEPTH_TEST);
 glDepthFunc(GL_LEQUAL);
 glDepthRange(200, 2000);

 //here i put some glBegins and glEnds

 glutSwapBuffers();}
int main(int argc, char **argv){   

 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
 glutInitWindowSize(1280, 720);
 glutInitWindowPosition(50, 86);
 glutCreateWindow("2D correlation function");
 glClearColor(1,1,1,1.0);

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glFrustum(-150, 150, -150, 150, 200, 2000);
 glutMouseFunc(mouse);
 glutMotionFunc(motion);
 glutKeyboardFunc(keyboard);
 gluLookAt(200,400,200,0,0.0,0.0,0.0,0.0,1.0);
 glScalef(0.4, 0.4, 0.4);
 glutDisplayFunc(display);
 timer();
 glutMainLoop();


 return 0;}
void mouse(int button, int state, int x, int y){

 GLdouble objX, objY, objZ;
 GLdouble matModelView[16], matProjection[16];
 GLint viewport[4];
 glGetDoublev(GL_MODELVIEW_MATRIX, matModelView);
 glGetDoublev(GL_PROJECTION_MATRIX, matProjection);
 glGetIntegerv(GL_VIEWPORT, viewport);
 GLfloat winX = x;
 GLfloat winY = viewport[3] - y;
 GLfloat winZ = 0;
 glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
 cout << winX << " " << winY << " " << winZ << " " <<endl;
 gluUnProject(winX, winY, winZ, matModelView, matProjection, viewport, &objX, &objY, &objZ);
 cout << objX << " " << objY << " " << objZ << " " <<endl;}
glEnable(GL_DEPTH | GL_DEPTH_TEST);
glDepthRange(200, 2000);