Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyOpenGL远面在近面上渲染_Python_Opengl_Pyopengl - Fatal编程技术网

Python pyOpenGL远面在近面上渲染

Python pyOpenGL远面在近面上渲染,python,opengl,pyopengl,Python,Opengl,Pyopengl,所以,我有一个问题,我已经追了几天了,我找不到任何帮助。我刚开始尝试学习pyOpenGL,很快就遇到了这个问题。我希望我已经包括了足够的信息,感谢任何和所有的帮助 问题是: 当我画一个立方体时,看起来后面的一些面在前面的面上进行渲染。这对我来说没有意义,因为背面应该离得更远,并且会出现在前面后面。下面我有一个关于这个问题的短片。我应该提到的是,这个问题似乎发生在我所遵循的教程中,但没有提到或修复。正如我所说,我是这方面的初学者,任何帮助都将不胜感激 问题视频: (立方体从左向右旋转) 设置: 我

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

问题是:

当我画一个立方体时,看起来后面的一些面在前面的面上进行渲染。这对我来说没有意义,因为背面应该离得更远,并且会出现在前面后面。下面我有一个关于这个问题的短片。我应该提到的是,这个问题似乎发生在我所遵循的教程中,但没有提到或修复。正如我所说,我是这方面的初学者,任何帮助都将不胜感激

问题视频: (立方体从左向右旋转)

设置:

我使用Python2.7.15、pyOpenGL 3.1.0和pygame 1.9.4在UbuntuLinux上运行这个程序

源代码:

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()
您必须启用。深度平面在绘制碎片之前启用测试。如果碎片未通过测试,则丢弃ti。默认深度函数()为
GL\u LESS
。这导致如果以前在同一位置绘制了一个片段,该片段的深度大于或等于新片段的深度,则该片段将被丢弃。深度存储在深度缓冲区中。 要使深度测试正常工作,您必须做两件事:

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

glDepthFunc(GL#u-LESS)#这是默认设置
glEnable(GL_深度_测试)
在颜色平面旁边,深度平面也必须通过()在每个帧中清除(这部分您已经完成):

glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位)
尝试在主功能开始时添加一个
glEnable(GL\u深度\u测试)