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

Opengl 使用glReadPixels和glunProject读取透明平面的深度值,opengl,mouse,transparency,depth,glreadpixels,Opengl,Mouse,Transparency,Depth,Glreadpixels,我正在尝试创建一个台球模拟,并一直在使用glReadPixels和GLUNProject将鼠标指针投影到场景中 如果鼠标指向场景中的某个对象(例如,表格),则此操作可以正常工作,但当鼠标指向背景时,由于glReadPixels调用返回1.0,会将gluUnProject弄乱 我正试图找出如何在桌子的同一水平面上绘制一个透明平面,这样无论我将鼠标指向场景中的何处,它都会获得与桌子指向同一平面的深度 如果我画一个没有glAlphaFunc的透明四边形(GL_更大,0.01f);它会将四边形绘制为白色

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

如果鼠标指向场景中的某个对象(例如,表格),则此操作可以正常工作,但当鼠标指向背景时,由于glReadPixels调用返回1.0,会将gluUnProject弄乱

我正试图找出如何在桌子的同一水平面上绘制一个透明平面,这样无论我将鼠标指向场景中的何处,它都会获得与桌子指向同一平面的深度

如果我画一个没有glAlphaFunc的透明四边形(GL_更大,0.01f);它会将四边形绘制为白色,深度测试将按照我的计划进行,但是当我添加对alphaFunc的调用以使四边形透明时,深度会恢复到以前的状态。据我所见,glReadPixels从帧缓冲区读取像素,所以这很有意义,我只是想知道如何解决这个问题

我也尝试过反转四边形上的缠绕,以便从上面看不到它,但这与glReadPixels从帧缓冲区获取其测量值的问题相同

简言之,如何获取glReadPixels以从对象获取其深度分量,而无需将该对象绘制到屏幕上

以下是对glReadPixels和glunProject的调用:

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

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


但是,gluUnProject不应在深度缓冲区值为1.0时阻塞;深度缓冲区值为1.0时,应得到的值是远剪裁平面的距离。

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


但是,gluUnProject不应在深度缓冲区值为1.0时阻塞;深度缓冲区值为1.0时,应该得到的值是远剪裁平面的距离。

可以使用

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

如果在此之后绘制某些内容,它仍将接受深度测试(如果启用),其深度值仍将写入深度缓冲区(如果启用),但其碎片在颜色缓冲区中不可见。

您可以使用

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
如果在此之后绘制某些内容,它仍将接受深度测试(如果启用),其深度值仍将写入深度缓冲区(如果启用),但其片段在颜色缓冲区中不可见