使用glReadPixels和gluUnProject读取透明平面的深度值

时间:2011-05-03 19:49:45

标签: opengl mouse transparency depth glreadpixels

我正在尝试创建一个台球模拟,并一直使用glReadPixels和gluUnProject将我的鼠标指针投射到场景中。

如果鼠标指向场景中的对象(例如表格),这可以正常工作,但是当它指向背景时,由于glReadPixels调用返回1.0,它会混淆gluUnProject。

我正在试图弄清楚如何在桌子的同一层绘制一个透明平面,这样无论我在哪里将鼠标指向我的场景,它都会得到深度,好像它指向同一个平面作为表格。

如果我绘制没有glAlphaFunc的透明四边形(GL_GREATER,0.01f);它会将四边形绘制为白色,深度测试将按照我的计划进行,但是当我添加对alphaFunc的调用以使四边形变得透明时,深度会回到之前的状态。从我所看到的,glReadPixels读取帧缓冲区中的像素,所以这是有道理的,我只是想知道如何解决这个问题。

我也试过反转四边形上的绕组,以便从上面看不到它,但这与glReadPixels从帧缓冲区进行测量有同样的问题。

简而言之,如何让glReadPixels从对象获取深度组件而不将该对象绘制到屏幕上?

这是对glReadPixels和gluUnProject的调用:

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);

2 个答案:

答案 0 :(得分:0)

这是因为alpha测试完全丢弃了未通过测试的像素。

然而,gluUnProject不应该阻塞深度缓冲值1.0;你应该得到的深度缓冲值为1.0的值是远剪裁平面的距离。

答案 1 :(得分:0)

您可以使用

完全禁用对颜色缓冲区的写入
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

如果你在此之后绘制一些东西,它仍然会得到深度测试(如果它已经打开)并且它的深度值仍将被写入深度缓冲区(如果它已打开)但是它的任何碎片都不会在颜色缓冲。