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 ES - 两种颜色最有效的纹理格式:白色和完全透明