【问题标题】:full transparent object in openGLopenGL中的完全透明对象
【发布时间】: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 我接收光标覆盖的对象的坐标,并使用这个表面,我可以得到一个点。

标签: c++ opengl opengl-1.x


【解决方案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 的建议使用颜色遮罩来禁用颜色写入,您可能会获得更好的性能。使用混合函数来丢弃表面的颜色是不必要的复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多