2

我正在尝试创建一个台球模拟,并且一直在使用 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);
4

2 回答 2

0

您可以使用完全禁用对颜色缓冲区的写入

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

如果您在此之后绘制某些内容,它仍将进行深度测试(如果已打开),其深度值仍将写入深度缓冲区(如果已打开),但其片段在颜色缓冲区中均不可见。

于 2011-05-03T23:17:26.133 回答
0

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

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

于 2011-05-03T20:38:17.767 回答