openGL中的完全透明对象

Posted

技术标签:

【中文标题】openGL中的完全透明对象【英文标题】:full transparent object in openGL 【发布时间】:2013-12-14 18:24:25 【问题描述】:

我需要创建一个完全透明的表面,它穿过轴的原点并始终平行于屏幕。 我正在尝试使用此代码(在 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);函数在其上获得一个点

【问题讨论】:

你能澄清一下你的意思吗:“我需要这个透明的表面来用函数gluUnProject(winX, winY, winZ, model, proj, view, &ox, &oy, &oz);在上面找到一个点”。我将此解释为“我需要这个表面来涵盖这一点”,但其他人的解释不同。 我正在使用这个表面来获取一个 (x,y,z) 点。使用 gluUnProject 我接收光标覆盖的对象的坐标,并使用这个表面,我可以得到一个点。 【参考方案1】:

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

glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
drawQuad();
glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
doUnproject();

【讨论】:

非常感谢。对于我的目的来说,它是完美的(而且简单)!【参考方案2】:

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

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

【讨论】:

如果我为 winZ 使用值 0 或 1,只有在我不改变场景的情况下,我才会有一个很好的解决方案......或者至少在我看来是这样 @user3102760:事实并非如此。不过,您必须使用正确的矩阵。 @user3102760: 不,因为所有的旋转等都被传递给gluUnProject 的模型视图矩阵所覆盖,glUnProject 所做的正是逆转 OpenGL 在将顶点转换到屏幕上时所做的过程.【参考方案3】:

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

   最终颜色 = (SourceColor * 1.0) + (DestinationColor * 1.0)。

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


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

   最终颜色 = (SourceColor * 0.0) + (DestinationColor * 1.0)。

         [...]

   最终颜色 = 原始颜色


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

【讨论】:

以上是关于openGL中的完全透明对象的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 使纹理透明 VBO

OpenGL ES - 两种颜色最有效的纹理格式:白色和完全透明

OpenGL透明与混色效果

如何使用 OpenGL 在 SDL 中获得正确的 SourceOver alpha 合成

Pangolin中opengl的混合(gl_blend)

体素中的 OpenGL 3D 透明度