我正在尝试创建一个台球模拟,并一直使用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);
答案 0 :(得分:0)
这是因为alpha测试完全丢弃了未通过测试的像素。
然而,gluUnProject不应该阻塞深度缓冲值1.0;你应该得到的深度缓冲值为1.0的值是远剪裁平面的距离。
答案 1 :(得分:0)
您可以使用
完全禁用对颜色缓冲区的写入glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
如果你在此之后绘制一些东西,它仍然会得到深度测试(如果它已经打开)并且它的深度值仍将被写入深度缓冲区(如果它已打开)但是它的任何碎片都不会在颜色缓冲。