openGL中的完全透明对象

时间:2013-12-14 18:24:26

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

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

获取一个点

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

  

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

不,不。 OpenGL不是场景图,并且没有义务使用从OpenGL获得的gluUnProject值。您只需传递winZ所需的任何内容即可。如果您对近剪裁平面感兴趣,则使用0,对于远剪裁平面感兴趣。此外,您可以完美地计算每个点的屏幕位置。 OpenGL并不神奇,它所做的转换有很好的文档记录,并且很容易自己执行。

答案 2 :(得分:1)

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

最终颜色=(来源颜色 * 1.0)+(目的地颜色 * 1.0)。

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

<小时/> 相反,请考虑glBlendFunc (GL_ZERO, GL_ONE)

最终颜色=(来源颜色 * 0.0)+(目的地颜色 * 1.0)。

[...]

最终颜色=原始颜色


也就是说,如果只是使用颜色掩码来禁用颜色写入,那么你可能会获得更好的性能。使用混合功能来丢弃表面的颜色是不必要的复杂。