Python PyOpengGL在编译着色器时引发错误

Python PyOpengGL在编译着色器时引发错误,python,python-3.x,opengl,pyqt5,pyopengl,Python,Python 3.x,Opengl,Pyqt5,Pyopengl,我正在运行OpenGL着色器教程和混合匹配的内容,试图实现自定义着色器。我有以下Python代码和回溯: 导入系统 从PyQt5.QtWidgets导入QApplication、QMainWindow、QOpenGLWidget 从PyQt5.QtCore导入Qt 从OpenGL.GL导入( glLoadIdentity、GLTRANSTEF、glRotatef、, glClear,glBegin,glEnd, glColor3fv,glVertex3fv, GLU颜色缓冲位,GLU深度缓冲位,

我正在运行OpenGL着色器教程和混合匹配的内容,试图实现自定义着色器。我有以下Python代码和回溯:

导入系统 从PyQt5.QtWidgets导入QApplication、QMainWindow、QOpenGLWidget 从PyQt5.QtCore导入Qt 从OpenGL.GL导入( glLoadIdentity、GLTRANSTEF、glRotatef、, glClear,glBegin,glEnd, glColor3fv,glVertex3fv, GLU颜色缓冲位,GLU深度缓冲位, GLU四边形、GLU线、, 着色器、GL_顶点着色器、GL_片段着色器 ) 从OpenGL.GLU导入GLU透视图 类主窗口(QMainWindow):#主类。 def按键事件(自身,事件):#这是按键检测器。 尝试: key=event.key() 除: 键=-1 #打印(键) 如果键==16777216: 退出() 顶点=[ (-1, 1, 0), (1, 1, 0), (1, -1, 0), (-1, -1, 0) ] 电线=[ (0, 1), (1, 2), (2, 3), (0, 3) ] 面=[ (0, 1, 2, 3) ] zoomLevel=-5 rotateDegreeH=0 rotateDegreeV=-45 vertShaderCode=“”#版本120 void main(){ gl_位置=gl_模型视图投影矩阵*gl_顶点; }""" fragShaderCode=“”#版本120 void main(){ gl_FragColor=vec4(0,1,0,1); }""" 定义初始化(自): 超级(主窗口,自我)。\uuuu初始化 self.sizeX=700#用于设置所有内容大小的变量 self.sizeY=600 self.setGeometry(0,0,self.sizeX+50,self.sizeY)#设置窗口大小 #制作着色器 顶点着色器=着色器.compileShader(self.vertShaderCode,GL\u顶点着色器) FRAGMENT\u SHADER=shaders.compileShader(self.fragShaderCode,GL\u FRAGMENT\u SHADER) self.shader=shaders.compileProgram(顶点着色器、片段着色器) self.openGLWidget=QOpenGLWidget(self)#创建GLWidget self.openGLWidget.setGeometry(0,0,self.sizeX,self.sizeY) self.openGLWidget.initializeGL() self.openGLWidget.resizeGL(self.sizeX,self.sizeY)#调整GL对窗口的了解以匹配物理大小? self.openGLWidget.paintGL=self.paintGL#是否用我自己的函数覆盖默认函数? def导航(自身,hVal=0,vVal=0,zVal=0): self.zoomLevel+=zVal 自旋转灰度+=hVal 自旋转greev+=vVal self.openGLWidget.update() def paintGL(自我): #此函数使用形状对象,例如立方体()或网格()。形状对象需要以下各项: #名为“顶点”的列表-此列表是一个点列表,从中绘制边和面。 #名为“wires”的列表-此列表是一个元组列表,元组引用顶点,指示在何处绘制导线。 #一个名为“facets”的列表——这个列表是一个元组列表,元组引用顶点,并在哪里绘制面。 #一个名为“render”的布尔值-此布尔值用于指示是否绘制形状。 #一个名为“drawWires”的布尔值-此布尔值用于指示是否应绘制导线。 #名为“drawFaces”的布尔值-此布尔值用于指示是否应绘制面。 着色器.glUseProgram(self.shader) glLoadIdentity() gluPerspective(45,self.sizeX/self.sizeY,0.1110.0)#设置透视图? glTranslatef(0,0,self.zoomLevel)#我在PyGame版本中使用了-10而不是-2。 glRotatef(self.rotateDegreeV,1,0,0)#我在PyGame版本中使用了2而不是1。 glRotatef(self.rotateDegreeH,0,0,1) glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位) glBegin(GLU线) 对于w in self.wires: 对于w中的v: glVertex3fv(自顶点[v]) 格伦德() glBegin(GLU四边形) 对于f,在self.facets中: 对于f中的v: glVertex3fv(自顶点[v]) 格伦德() app=QApplication([]) 窗口=主窗口() window.show() sys.exit(app.exec_())
C:\Users\ccronk22\Documents\Python\glShaders>pygl002.py
回溯(最近一次呼叫最后一次):
文件“C:\Users\ccronk22\AppData\Local\Programs\Python38\lib\site packages\OpenGL\latebind.py”,第43行,在调用中__
返回自我。_finalCall(*args,**已命名)
TypeError:“非类型”对象不可调用
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“C:\Users\ccronk22\Documents\Python\glShaders\pyGL002.py”,第109行,在
窗口=主窗口()
文件“C:\Users\ccronk22\Documents\Python\glShaders\pyGL002.py”,第59行,在\uuu init中__
顶点着色器=着色器.compileShader(self.vertShaderCode,GL\u顶点着色器)
文件“C:\Users\ccronk22\AppData\Local\Programs\Python38\lib\site packages\OpenGL\GL\shaders.py”,第228行,在compileShader中
着色器=glCreateShader(shaderType)
文件“C:\Users\ccronk22\AppData\Local\Programs\Python38\lib\site packages\OpenGL\latebind.py”,第46行,在调用中__
self.\u finalCall=self.finalize()
文件“C:\Users\ccronk22\AppData\Local\Programs\Python38\lib\site packages\OpenGL\extensions.py”,第242行,最终定稿
raise error.NULLFUNCTION错误(
OpenGL.error.NullFunctionError:尝试调用未定义的备用函数(glCreateShader、glCreateShaderObjectARB),在调用前检查bool(glCreateShader)
C:\Users\ccronk22\Documents\Python\glShaders>
如果注释掉compileShader、compileProgram和useProgram行,则上述代码运行良好。从上面的角度看,它会生成一个白色正方形:

def\uuuu初始化(自):
超级(主窗口,自我)。\uuuu初始化
东南方