【问题标题】:Reading depth value of transparent plane with glReadPixels and gluUnProject使用 glReadPixels 和 gluUnProject 读取透明平面的深度值
【发布时间】:2011-08-18 00:11:21
【问题描述】:

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

【问题讨论】:

    标签: opengl mouse transparency depth glreadpixels


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
      

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

      【讨论】:

        猜你喜欢
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-23
        • 1970-01-01
        • 2019-09-23
        • 1970-01-01
        相关资源
        最近更新 更多