PyOpenGL段错误

时间:2017-04-23 01:17:30

标签: python opengl pygame

我正在关注一个教程并且与运行教程的人员有相同的代码,并且已经下载了相同的软件包等,但是我收到了错误而他却没有。任何帮助解释以下代码中的错误将不胜感激。我应该补充一点,我在这里看到了类似的线程,但到目前为止还没有解决方案有帮助。作为参考,它返回错误

Fatal Python error: (pygame parachute) Segmentation Fault

Current thread 0x00000ba4 (most recent call first):

  File "C:/Users/00101010/PycharmProjects/3DPygame/textcompare.py", line 44 in main

  File "C:/Users/00101010/PycharmProjects/3DPygame/textcompare.py", line 63 in <module>

Process finished with exit code 3

以下是代码。

import pygame
from pygame import *
from OpenGL.GL import *
from OpenGL.GLU import *
import sys

vertices = (
    (1, -1, -1),
    (1, 1, -1),
    (-1, 1, -1),
    (-1, -1, -1),
    (1, -1, 1),
    (1, 1, 1),
    (-1, -1, 1),
    (-1, 1, 1)
)

edges = (
    (0, 1),
    (0, 3),
    (0, 4),
    (2, 1),
    (2, 3),
    (2, 7),
    (6, 3),
    (6, 4),
    (6, 7),
    (5, 1),
    (5, 4),
    (5, 7)
)


def Cube():
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()


def main():
    pygame.init()
    displaysize = (800, 600)
    pygame.display.set_mode(displaysize, DOUBLEBUF | OPENGL)

    gluPerspective(45, (displaysize[0] / displaysize[1]), 0.1, 50.0)

    glTranslatef(0.0, 0.0, -5)

    while True:
        for i in pygame.event.get():
            if i.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        glRotatef(1, 3, 1, 1)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        Cube()
        pygame.display.flip()
        pygame.time.wait(10)


main()

修改

sys.version的输出为3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)]

运行仅使用PyOpenGL的示例导致init中第35行出现此错误(脚本中的第76行):

OpenGL.error.GLError: GLError( err = 1282, description = b'invalid operation', baseOperation = glViewport, cArguments = (0, 0, 1366, 768) )

错误仍在继续:

freeglut (C:/Users/OOIOIOIO/PycharmProjects/OpenGLstuff/OpenGLtest.py‌​): fgInitGL2: fghGenBuffers is NULL

这是一款相当古老的toshiba卫星c660笔记本电脑,从2010年左右开始配备英特尔奔腾CPU P6100并且没有专用显卡。

1 个答案:

答案 0 :(得分:0)

  

致命的Python错误:( pygame降落伞)分段错误

     

pygame.display.set_mode()失败。

这听起来很奇怪,因为pygame.display.set_mode()不应该像那样失败。如果不支持指定的显示模式,则pygame将回退并使用其他内容。但是从来没有像这样直接失败。

  

优点是如果您的显示模式不可用,pygame将模拟您要求的显示模式。

     

- Pygame Setting Display Modes

因此,既然您正在处理段错误,那么您似乎正在处理一些不受支持且可能过时且过时的事情。

我已将您的代码重写为仅使用PyOpenGL。 您可以验证在没有参与pygame时是否能够运行它吗?

import sys
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *


vertices = [
    (1, -1, -1),
    (1, 1, -1),
    (-1, 1, -1),
    (-1, -1, -1),
    (1, -1, 1),
    (1, 1, 1),
    (-1, -1, 1),
    (-1, 1, 1)
]

edges = [
    (0, 1),
    (0, 3),
    (0, 4),
    (2, 1),
    (2, 3),
    (2, 7),
    (6, 3),
    (6, 4),
    (6, 7),
    (5, 1),
    (5, 4),
    (5, 7)
]


def init(width, height):
    glViewport(0, 0, width, height)

    glClearColor(0.0, 0.0, 0.0, 1.0)

    glMatrixMode(GL_PROJECTION)
    gluPerspective(45.0, (width / height), 0.1, 50.0)

    glMatrixMode(GL_MODELVIEW)
    glTranslatef(0.0, 0.0, -5.0)


def display():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glRotatef(1.0, 3.0, 1.0, 1.0)

    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

    glutSwapBuffers()


def resize(width, height):
    glViewport(0, 0, width, height)


if __name__ == "__main__":
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    glutInitWindowSize(640, 480)
    glutInitWindowPosition(200, 200)

    glutCreateWindow(b"OpenGL")

    glutDisplayFunc(display)
    glutIdleFunc(display)
    glutReshapeFunc(resize)

    init(glutGet(GLUT_SCREEN_WIDTH), glutGet(GLUT_SCREEN_HEIGHT))

    glutMainLoop()

请注意,如果您收到与此类似的错误:

  

OpenGL.error.NullFunctionError:尝试调用未定义的函数glutInit,在调用之前检查bool(glutInit)

然后呢,因为你没有过剩的freeglut(你可以download precompiled binaries here)。

请注意,由于sys.version会返回3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)],因此比抱歉更安全并下载 freeglut 3.0.0 MSVC Package 。由于您使用的是64位,因此请确保使用64位版本的freeglut.dll(zip包含两个版本)。将freeglut.dll放在Python脚本旁边的项目目录中。

  

它返回了这个错误,在init中的第35行,在模块中的第76行

 OpenGL.error.GLError: GLError( err = 1282, description = b'invalid operation', baseOperation = glViewport, cArguments = (0, 0, 1366, 768) )
     

此错误仍在继续

freeglut (C:/Users/OOIOIOIO/PycharmProjects/OpenGLstuff/OpenGLtest.py‌​): fgInitGL2: fghGenBuffers is NULL

那不应该发生。看起来不太可能显卡不支持任何形式的OpenGL。 但考虑到它与glViewport()(自1.0以来一直是核心)有问题。然后听起来就是这种情况。尝试运行OpenGL Extensions Viewer并查看其内容。

  

Intel Pentium CPU P6100

看起来你的CPU根本不支持OpenGL。 The specification doesn't even mention OpenGL at all。与此说明Intel Core i7-7Y75(作为随机例子)。