pyOpenGL дальние лица рендерится на близких - PullRequest
1 голос
/ 13 марта 2019

Итак, у меня есть проблема, за которой я гоняюсь уже пару дней, и я не могу найти ничего, чтобы помочь.Я только начал пытаться изучать 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()

1 Ответ

1 голос
/ 13 марта 2019

Вы должны включить Проверка глубины . Плоскость глубины позволяет провести тест до рисования фрагмента. Если фрагмент не проходит тест, ti отбрасывается. Функция глубины по умолчанию (glDepthFunc) - GL_LESS. Это приводит к тому, что фрагмент отбрасывается, если фрагмент был нарисован ранее в том же месте, глубина которого больше или равна глубине нового фрагмента. Глубина сохраняется в буфере глубины. Чтобы сделать тест глубины, вы должны сделать 2 вещи:

Включите его и установите правильную функцию глубины при инициализации состояний OpenGL:

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

А кроме цветовой плоскости, плоскость глубины также должна очищаться в каждом кадре с помощью (glClear) (эту часть вы уже сделали):

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
...