我正在尝试在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,)
)
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)
答案 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
而不是GameWidget
(QGLWidget
)。这里的问题是您不能轻易地将其他小部件添加到QGLWidget
。这就是为什么与OpenGL相关的人通常会有自定义GUI或所有控件,标签等等的单独窗口。