pyOpenGL Far Faces渲染效果更接近

时间:2019-03-13 02:47:27

标签: python opengl pyopengl

所以我有一个问题,我已经追逐了几天,找不到任何帮助。我刚刚开始尝试学习pyOpenGL,并很快遇到了这个问题。希望我提供了足够的信息,感谢您提供的所有帮助。

问题:

当我绘制一个立方体时,似乎后面的某些面正在渲染前面的面。这对我来说没有意义,因为背面应该更远,并会出现在正面后面。我在下面有一个简短的录像带。我应该提到这个问题似乎是在我正在遵循的教程中发生的,但并未提及或解决。就像我说的那样,我是新手,我们将不胜感激。

问题视频:https://media.giphy.com/media/OT6SrDbj5NopQpD8Pt/giphy.gif (多维数据集从左到右旋转)

设置:

我正在使用python 2.7.15和pyOpenGL 3.1.0和pygame 1.9.4在Ubuntu Linux上运行此

源代码:

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()

1 个答案:

答案 0 :(得分:1)

您必须启用Depth Test。深度平面可以在绘制片段之前进行测试。如果片段未通过测试,则将丢弃ti。默认深度功能(glDepthFunc)为GL_LESS。如果片段在先前相同的位置绘制,则片段会被丢弃,该片段的深度大于或等于新片段的深度。深度存储在深度缓冲区中。 要使深度测试正常工作,您必须做两件事:

在OpenGL状态初始化时启用它并设置适当的深度功能:

glDepthFunc(GL_LESS)     # this is default
glEnable(GL_DEPTH_TEST)  

在色平面旁边,还必须在每一帧中通过({glClear)清除深度平面(这部分您已经完成了):

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)