在PyOpenGL中绘制透明的子表面(窗口)?

时间:2014-05-12 16:02:30

标签: python opengl graphics transparency pyopengl

我有一个绘制立方体的简单PyOpenGL程序。我试图在立方体的正面绘制透明的地下(窗口)。我可以让两个表面都显示出来,但不能代表一个窗口。

这是我绘制立方体的代码:

    # Draws the six faces of a cube
def DrawCube(self):
    # Front face - Blue
    glPushName(1)
    glBegin(GL_QUADS)
    glColor4f(0.0, 0.0, 1.0, 1.0)
    glNormal3f(0.0, 0.0, 1.0) # Allows for light to reflect off certain parts of surface
    glVertex3f(1.0, 0.0, 0.0)
    glVertex3f(1.0, 1.0, 0.0)
    glVertex3f(1.0, 1.0, 1.0)
    glVertex3f(1.0, 0.0, 1.0)
    glEnd()

    # Back face - Green
    glPushName(2)
    glBegin(GL_QUADS)
    glColor4f(0.0, 1.0, 0.0, 1.0)
    glNormal3f(0.0, 0.0,-1.0)
    glVertex3f(0.0, 0.0, 0.0)
    glVertex3f(0.0, 1.0, 0.0)
    glVertex3f(0.0, 1.0, 1.0)
    glVertex3f(0.0, 0.0, 1.0)
    glEnd()

    # Left face - Red
    glPushName(3)
    glBegin(GL_QUADS)
    glColor4f(1.0, 0.0, 0.0, 1.0)
    glNormal3f(-1.0,0.0, 0.0)
    glVertex3f(0.0, 0.0, 0.0)
    glVertex3f(1.0, 0.0, 0.0)
    glVertex3f(1.0, 0.0, 1.0)
    glVertex3f(0.0, 0.0, 1.0)
    glEnd()

    # Right face - Orange
    glPushName(4)
    glBegin(GL_QUADS)
    glColor4f(1.0, 0.55, 0.0, 1.0)
    glNormal3f(1.0, 0.0, 0.0)
    glVertex3f(1.0, 1.0, 0.0)
    glVertex3f(1.0, 1.0, 1.0)
    glVertex3f(0.0, 1.0, 1.0)
    glVertex3f(0.0, 1.0, 0.0)
    glEnd()

    # Top face - White
    glPushName(5)
    glBegin(GL_QUADS)
    glColor4f(1.0, 1.0, 1.0, 1.0)
    glNormal3f(0.0, 1.0, 0.0)
    glVertex3f(0.0, 0.0, 1.0)
    glVertex3f(1.0, 0.0, 1.0)
    glVertex3f(1.0, 1.0, 1.0)
    glVertex3f(0.0, 1.0, 1.0)
    glEnd()

    # Bottom face - Yellow
    glPushName(6)
    glBegin(GL_QUADS)
    glColor4f(1.0, 1.0, 0.0, 1.0)
    glNormal3f(0.0,-1.0, 0.0)
    glVertex3f(0.0, 0.0, 0.0)
    glVertex3f(0.0, 1.0, 0.0)
    glVertex3f(1.0, 1.0, 0.0)
    glVertex3f(1.0, 0.0, 0.0)
    glEnd()

    # Window on Front (Blue) Face
    glPushName(7)
    glBegin(GL_QUADS)
    glColor4f(0.0, 1.0, 1.0, 0.4)
    glNormal3f(0.0, 0.0, 1.0)
    glVertex3f(1.0, 0.25, 0.25)
    glVertex3f(1.0, 0.75, 0.25)
    glVertex3f(1.0, 0.75, 0.75)
    glVertex3f(1.0, 0.25, 0.75)
    glEnd()

这是我绘画的结果。 Cube Rendering

我想让窗户完全透明,这样你就可以看到立方体的另一面。我该怎么做?

1 个答案:

答案 0 :(得分:1)

你有两个问题。首先,您需要设置混合,以便通过半透明窗口显示不透明几何体:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

您正在看到的工件来自绘制两个共面多边形。在理想的世界中,它们最终会在同一像素处具有相同的深度值。但由于所有计算都是以有限的精度完成的,因此可能存在细微的差异,并且由于舍入误差,一个多边形出现在另一个之前。这通常被称为"深度战斗"或" z战斗"。

为避免深度对抗问题,您必须在立方体前面略微绘制窗口。您可以通过为窗口使用稍大的x坐标来实现。

还有一个内置的机制
glPolygonOffset(1.0f, 1.0f);
glEnable(GL_POLYGON_OFFSET_FILL);

您可能希望使用glPolygonOffset()的确切参数来获得理想的结果。