glReadPixels的使用问题

想把屏幕上的二维坐标转换成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

 

找到问题的症结了

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值