在PyOpenGL中绘制透明子曲面(windows)?

2024-04-26 09:47:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的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

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


Tags: of程序绘制bluefacefrontpyopenglgl
1条回答
网友
1楼 · 发布于 2024-04-26 09:47:04

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

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

你看到的人工制品是从绘制两个共面多边形。在一个理想的世界里,它们最终会在同一个像素上得到相同的深度值。但由于所有的计算都是以有限的精度完成的,所以可能会有细微的差异,并且由于舍入误差,一个多边形会出现在另一个多边形的前面。这通常被称为“深度战斗”或“z战斗”。在

为了避免深度冲突的问题,你必须把你的窗口稍微放在立方体前面。您可以使用稍微大一点的窗口x坐标来实现这一点。OpenGL还有一个内置机制

^{pr2}$

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

相关问题 更多 >