0

我需要创建一个完全透明的表面,穿过轴的原点并始终平行于屏幕。我正在尝试使用此代码(在 中c++),但结果类似于 50% 混合(不完全):

glPushMatrix();     

    glLoadIdentity();                       

    glBlendFunc(1, 1);

    glBegin(GL_QUADS);
    glVertex3f(-100, -100, -0.003814);
    glVertex3f(100, -100, -0.003814);
    glVertex3f(100, 100, -0.003814);
    glVertex3f(-100, 100, -0.003814);
    glEnd();

glPopMatrix();

附加信息:我需要这个透明表面来使用该功能在其上获得一个点gluUnProject(winX, winY, winZ, model, proj, view, &ox, &oy, &oz);

4

3 回答 3

1

如果您只想填充深度缓冲区,您可以通过以下方式禁用颜色写入glColorMask()

glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
drawQuad();
glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
doUnproject();
于 2013-12-14T19:08:31.377 回答
1

您正在使用的混合功能称为加法混合:

   最终颜色 =(源颜色* 1.0)+(目标颜色* 1.0)。

这不是完全透明的,除非帧缓冲区在您混合的位置已经是全白的(目标颜色== (1.0, 1.0, 1.0))。即使这样,这种行为也只有在您使用定点渲染目标时才有效,因为默认情况下混合后值被限制为 [0.0,1.0]。


相反,请考虑glBlendFunc (GL_ZERO, GL_ONE)

   最终颜色 =(源颜色* 0.0)+(目标颜色* 1.0)。

         [...]

   最终颜色 = 原始颜色


也就是说,如果您只是按照 genpfault 的建议使用颜色遮罩来禁用颜色写入,您可能会获得更好的性能。使用混合功能来丢弃表面的颜色是不必要的复杂。

于 2013-12-14T22:57:05.953 回答
1

附加信息:我需要这个透明表面来使用 gluUnProject(winX, winY, winZ, model, proj, view, &ox, &oy, &oz);

不,你没有。OpenGL 不是场景图,没有义务使用从 OpenGL 获得的 gluUnProject 值。你可以简单地传入任何你想要的winZ。如果您对近剪裁平面感兴趣,请使用 0,对远剪裁平面使用 1。您也可以完美地计算每个点的屏幕位置。OpenGL 并不神奇,它所做的转换有据可查,而且很容易自己执行。

于 2013-12-14T20:20:11.797 回答