【发布时间】:2014-05-12 16:02:29
【问题描述】:
我有一个绘制立方体的简单 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()
这是我正在绘制的结果。
我想让窗口完全透明,这样你就可以看到立方体的另一侧。我该怎么做?
【问题讨论】:
-
很难确定,但是您可以考虑使用模板缓冲区来切出由“窗口”定义的立方体面区域,而不会出现那些深度对抗伪影。当然,您需要按特定顺序绘制立方体的其余部分,并且您可能希望禁用面部剔除,以便有一些可见的东西。
-
1.重写你的模型,这样你的透明面就不会与任何其他四边形重叠。 2.要结合透明和实心多边形,您必须对多边形进行 Z 排序(从最远到最近绘制所有多边形)Z-Buffer 是不够的!!!
-
我发现你可以使用镶嵌来绘制复杂的多边形。对于任何想要做类似事情的人来说,这是一个很棒的链接。 OpenGL Tesselation
标签: python opengl graphics transparency pyopengl