OpenGL:PyCharm在Mac上意外退出

时间:2017-04-10 17:50:47

标签: macos opengl pyqt pycharm

我正在尝试在Mac OS X上运行适用于Windows的项目。该项目正在使用OpenGL和PyQt库。尝试使用OpenGL库似乎存在问题。

我下载了一个可以工作的螺旋的OpenGL演示。

print("OpenGL: " + str(glGetString(GL_VERSION)))

返回OpenGL:b'2.1 NVIDIA-10.0.51 310.90.10.05b12'

当我尝试运行另一个项目时,PyCharm意外退出,我得到以下内容:

Traceback (most recent call last):
  File "/CS 410/Agile-Development-Project-master2/package/ui/widgets/gamewidget.py", line 177, in initializeGL
    glPrimitiveRestartIndex(self.restart)
  File "/anaconda/lib/python3.5/site-packages/OpenGL/platform/baseplatform.py", line 402, in __call__
    return self( *args, **named )
  File "errorchecker.pyx", line 53, in OpenGL_accelerate.errorchecker._ErrorChecker.glCheckError (src/errorchecker.c:1218)
OpenGL.error.GLError: GLError(
    err = 1282,
    description = b'invalid operation',
    baseOperation = glPrimitiveRestartIndex,
    cArguments = (4294967295,)
)

Picture of Mac Info

Project Link

mainwindow.py

from PyQt5 import QtOpenGL
from PyQt5.QtWidgets    import QMainWindow, QStackedWidget
from package.ui.widgets import GameWidget

class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()

        glformat = QtOpenGL.QGLFormat()
        glformat.setVersion(3, 1)
        glformat.setProfile(QtOpenGL.QGLFormat.CoreProfile)

        self.setWindowTitle('Game name here')
        #self.stacked_widget = QStackedWidget(GameWidget())
        self.setCentralWidget(GameWidget(glformat))
gamewidget.py中的

init

def __init__(self, *args, n=10, **kwargs):

将版本设置为3.2: glGetString(GL_VERSION)返回3.3上下文

新错误(python仍然意外退出):

Traceback (most recent call last):
  File "/Users/daniel/WSCU/Spring 2017/CS 410/Agile-Development-Project-mastercurrent/package/ui/widgets/gamewidget.py", line 183, in initializeGL
    self.initializeCube()
  File "/Users/daniel/WSCU/Spring 2017/CS 410/Agile-Development-Project-mastercurrent/package/ui/widgets/gamewidget.py", line 142, in initializeCube
    program = self.loadShaders()
  File "/Users/daniel/WSCU/Spring 2017/CS 410/Agile-Development-Project-mastercurrent/package/ui/widgets/gamewidget.py", line 227, in loadShaders
    raise RuntimeError(glGetShaderInfoLog(fs))
RuntimeError: b"ERROR: 0:6: Use of undeclared identifier 'gl_FragColor'\n"

编辑:

def initializeTimer(self):
    self.pbar = QProgressBar(self)
    self.pbar.setGeometry(30, 40, 200, 25)
    self.timer = QBasicTimer()
    self.timer.start(1200, self)
    self.step = 100
    self.pbar.setValue(self.step)
    self.btn = QPushButton("Time is: " + str(int(self.step * 1.2)), self)
    self.btn.setStyleSheet("background-color: black; color: red;")
    self.btn.move(500, 10)
    self.show()


def timerEvent(self, e):
    if self.step <= 0:
        self.timer.stop()
        return
    self.step -= 1
    self.score += 1
    # print(self.score)
    self.btn.setText("Time is: " + str(int(self.step * 1.2)))
    self.scoreLabel.setText("Score: " + str(int(self.score)))
    self.pbar.setValue(self.step)
    self.pbar.setVisible(True)
    print(self.btn.text())
    print(self.pbar.text())


def makeScoreLabel(self):
    self.scoreLabel = QPushButton("Score: " + str(int(self.score)), self)
    self.scoreLabel.setStyleSheet("background-color: white; color: red;")
    self.scoreLabel.move(200, 10)

1 个答案:

答案 0 :(得分:2)

您正在使用2.1上下文,glPrimitiveRestartIndex()是3.1(核心)函数。

要请求3.1上下文,请创建QGLFormat()并指定版本。

glformat = QtOpenGL.QGLFormat()
glformat.setVersion(3, 1)
glformat.setProfile(QtOpenGL.QGLFormat.CoreProfile)

然后在创建GLWidget时将其传递给QGLWidget(glformat)

所以与你的项目有关。由于GameWidget扩展QGLWidget,这意味着您应该将glformat传递给GameWidget中的mainwindow.py

self.setCentralWidget(GameWidget(glformat))

请注意__init__中的GameWidget。由于n出现在*args之前,这意味着b最终成为format,所以您需要重新安排它,如下所示:

def __init__(self, *args, n=10, **kwargs)

现在您的问题实际上是您的片段着色器。

  

0(5):错误C7533:版本120之后不推荐使用全局变量gl_FragColor

您将版本设置为330,这意味着不推荐使用gl_FragColor。相反,您必须指定自己的颜色输出。

#version 330

out vec4 outColor;

in vec3 fcolor;

void main()
{
   outColor = vec4(fcolor, 1.0);
}

您仍然需要将glformat传递给QGLWidget

修改

如果你想添加一个标签,那么而不是:

self.widget = GameWidget()
self.setCentralWidget(self.widget)

然后你需要这样做:

from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel

self.label = QLabel()
self.label.setText("Hello World")

self.layout = QVBoxLayout()
self.layout.addWidget(self.label)

self.widget = QWidget()
self.widget.setLayout(self.layout)

self.setCentralWidget(self.widget)

问题当然是现在我们有一个新的QWidget而不是GameWidgetQGLWidget)。这里的问题是您不能轻易地将其他小部件添加到QGLWidget。这就是为什么与OpenGL相关的人通常会有自定义GUI或所有控件,标签等等的单独窗口。