glReadPixels的使用问题

分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

想把屏幕上的二维坐标转换成OpenGL下面的三维坐标

一般常用的方法是:

 GLint    viewport[4];
 GLdouble modelview[16];
 GLdouble projection[16];
 GLfloat  winX, winY, winZ;

 glGetIntegerv(GL_VIEWPORT, viewport); // 得到的是最后一个设置视口的参数
 glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
 glGetDoublev(GL_PROJECTION_MATRIX, projection);

 winX = pt.x;
 winY = viewport[3] - pt.y;

 
 glReadPixels((int)winX, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

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

都没错。但是,经常会出现winZ值为1.0的情况

就像我所做的,功能是移动物体,如果winZ的值为1.0之后,物体就跑的没影了

 TRACE("point:%f, %f, %f  \t", winX, winY, winZ);
 TRACE("pos  :%f, %f, %f \n", posX, posY, posZ);
跟踪一下,居然发现如下的输出:

 point:633.000000, 301.000000, 0.963236
 pos  :0.318562, -9.291403, 0.769923
 point:633.000000, 298.000000, 1.000000
 pos  :39.343056, -1186.848810, -9917.619793

 

注意这里:当winZ的值变成1.0的时候就出现错误了

 

经过多方查找资料,发现了一个重大的问题:

glRealPixels的定义是什么?

——The glReadPixels function reads a block of pixels from the framebuffer.

问题就出现在这里

如果framebuffer里面没有东西,当然就读取不出来了啊

所以就会出现上面的错误。

 

经验证,果不然,如果鼠标点在空白的位置

point:439.000000, 356.000000, 1.000000   pos  :-2504.841247, -426.216424, -9799.354916

 

找到问题的症结了

那么下面将好好学习一下帧缓存,然后把解决方案分享给大家。

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

猜你喜欢

转载自www.cnblogs.com/sownchz/p/10499477.html