pyOpenGL 远面渲染近面
pyOpenGL Far Faces Render over Close Ones
所以我遇到了一个问题,我已经解决了几天了,但找不到任何帮助。我刚刚开始尝试学习 pyOpenGL,并很快 运行 解决了这个问题。我希望我提供了足够的信息,感谢您提供的所有帮助。
问题:
当我绘制立方体时,背面的某些面似乎渲染在正面的面上。这对我来说没有意义,因为背面应该更远并且会出现在正面后面。我有下面这个问题的简短视频。我应该提一下,这个问题似乎出现在我正在关注的教程中,但没有被提及或修复。正如我所说,我是这方面的初学者,我们将不胜感激。
问题视频:https://media.giphy.com/media/OT6SrDbj5NopQpD8Pt/giphy.gif
(立方体从左到右旋转)
设置:
我在 Ubuntu Linux 上 运行 使用 python 2.7.15 和 pyOpenGL 3.1.0 以及 pygame 1.9.4
源代码:
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
colors=(
(255, 0, 0), #Red
(0, 255, 0), #Green
(0, 0, 255), #Blue
)
verts = (
(1.0, -1.0, -1.0),
(1.0, -1.0, 1.0),
(-1.0, -1.0, 1.0),
(-1.0, -1.0, -1.0),
(1.0, 1.0, -1.0),
(1.0, 1.0, 1.0),
(-1.0, 1.0, 1.0),
(-1.0, 1.0, -1.0)
)
surfaces = (
(0, 1, 2, 3),
(4, 7, 6, 5),
(0, 4, 5, 1),
(1, 5, 6, 2),
(2, 6, 7, 3),
(4, 0, 3, 7)
)
def cube_obj(faces, vertices):
glBegin(GL_QUADS)
x = 0
for face in faces:
glColor3fv(colors[x])
x += 1
if x > 2:
x = 0
for vertex in face:
glVertex3fv(vertices[vertex])
glEnd()
def main():
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
gluPerspective(75, (display[0]/display[1]), 0.1, 50.0)
glTranslatef(-0.0, 0.0, -10.0)
glClearColor(1, 1, 1, 1)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
cube_obj(surfaces, verts)
glRotatef(.5, 0, 1, 0)
pygame.display.flip()
pygame.time.wait(10)
main()
您必须启用 Depth Test. The depth plane enables an test before a fragment is drawn. If the fragment doesn't pass the test ti is discarded. The default depth function (glDepthFunc
) 是 GL_LESS
。如果之前在同一个地方绘制了片段,这会导致片段被丢弃,该片段的深度大于或等于新片段的深度。深度存储在深度缓冲区中。
要进行深度测试,您需要做两件事:
在 OpenGL 状态初始化时启用它并设置适当的深度函数:
glDepthFunc(GL_LESS) # this is default
glEnable(GL_DEPTH_TEST)
除了颜色平面之外,深度平面也必须在每一帧中由 (glClear
) 清除(这部分你已经完成了):
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
所以我遇到了一个问题,我已经解决了几天了,但找不到任何帮助。我刚刚开始尝试学习 pyOpenGL,并很快 运行 解决了这个问题。我希望我提供了足够的信息,感谢您提供的所有帮助。
问题:
当我绘制立方体时,背面的某些面似乎渲染在正面的面上。这对我来说没有意义,因为背面应该更远并且会出现在正面后面。我有下面这个问题的简短视频。我应该提一下,这个问题似乎出现在我正在关注的教程中,但没有被提及或修复。正如我所说,我是这方面的初学者,我们将不胜感激。
问题视频:https://media.giphy.com/media/OT6SrDbj5NopQpD8Pt/giphy.gif (立方体从左到右旋转)
设置:
我在 Ubuntu Linux 上 运行 使用 python 2.7.15 和 pyOpenGL 3.1.0 以及 pygame 1.9.4
源代码:
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
colors=(
(255, 0, 0), #Red
(0, 255, 0), #Green
(0, 0, 255), #Blue
)
verts = (
(1.0, -1.0, -1.0),
(1.0, -1.0, 1.0),
(-1.0, -1.0, 1.0),
(-1.0, -1.0, -1.0),
(1.0, 1.0, -1.0),
(1.0, 1.0, 1.0),
(-1.0, 1.0, 1.0),
(-1.0, 1.0, -1.0)
)
surfaces = (
(0, 1, 2, 3),
(4, 7, 6, 5),
(0, 4, 5, 1),
(1, 5, 6, 2),
(2, 6, 7, 3),
(4, 0, 3, 7)
)
def cube_obj(faces, vertices):
glBegin(GL_QUADS)
x = 0
for face in faces:
glColor3fv(colors[x])
x += 1
if x > 2:
x = 0
for vertex in face:
glVertex3fv(vertices[vertex])
glEnd()
def main():
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
gluPerspective(75, (display[0]/display[1]), 0.1, 50.0)
glTranslatef(-0.0, 0.0, -10.0)
glClearColor(1, 1, 1, 1)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
cube_obj(surfaces, verts)
glRotatef(.5, 0, 1, 0)
pygame.display.flip()
pygame.time.wait(10)
main()
您必须启用 Depth Test. The depth plane enables an test before a fragment is drawn. If the fragment doesn't pass the test ti is discarded. The default depth function (glDepthFunc
) 是 GL_LESS
。如果之前在同一个地方绘制了片段,这会导致片段被丢弃,该片段的深度大于或等于新片段的深度。深度存储在深度缓冲区中。
要进行深度测试,您需要做两件事:
在 OpenGL 状态初始化时启用它并设置适当的深度函数:
glDepthFunc(GL_LESS) # this is default
glEnable(GL_DEPTH_TEST)
除了颜色平面之外,深度平面也必须在每一帧中由 (glClear
) 清除(这部分你已经完成了):
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)