当前位置: 首页 > 工具软件 > PyOpenGL > 使用案例 >

PyOpenGL的环境配置心得

尉迟正奇
2023-12-01

我想用PyQt5做一个3维显示的界面,有如下方案:

1,使用PyQt5的opengl接口;

2,仅使用qt做界面以及创建opengl上下文(QOpenGLWdiget),然后使用pyopengl调用gl的接口;

最初我选择方案1,发现pyqt5对opengl的支持不及C++版的qt,例如C++的QT可以使用QOpenGLFunctions_3_3_Core,但是pyqt5就没有,pyqt5只有_QOpenGLFunctions_2_0,_QOpenGLFunctions_2_1,_QOpenGLFunctions_4_1_Core可以使用,我好不容易才找到利用qt使用4.1 core版本gl函数的方法:

        version_profile = QOpenGLVersionProfile()
        version_profile.setVersion(4, 1)
        version_profile.setProfile(QSurfaceFormat.CoreProfile)
        self.glx = self.context().versionFunctions(version_profile)
        self.glx.initializeOpenGLFunctions()

但是却有下面的错误:

 'QOpenGLFunctions_4_1_Core' object has no attribute 'glGenVertexArrays'

于是放弃了使用qt的gl函数,决定使用pyopengl来调用opengl。

我使用的是anaconda(python3.8.5),用conda来安装pyopengl。

但是,PyOpenGL_accelerate一定要用pip来安装,否则会报:

AttributeError: module 'numpy' has no attribute 'float128'错误

使用pyopengl的时候也要注意,有些gl接口与C语言版的不同!

特别是要注意,空指针(void*)(0)不能用0来代替!要用None或者c_void_p(0)或者ctypes.cast(0, ctypes.c_void_p)如:

 gl.glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeOfFloat, None);

最后一个参数,要填None,不能填0

===================================================================

2022.03.28 更新:

今天在新电脑上配环境,pyopengl使用conda install pyopengl来安装,pyopengl-accelerate使用pip来安装,安装的版本是:

pyopengl                  3.1.1a1          py38haa95532_0
pyopengl-accelerate       3.1.6                    pypi_0    pypi

numpy使用conda install numpy来安装,安装的版本是:

numpy                     1.21.5           py38ha4e8547_0
numpy-base                1.21.5           py38hc2deb75_0

结果报下面的错误:

 in initializeGL
    compileShader(vertexShaderSource, gl.GL_VERTEX_SHADER),
  File "D:\ProgramData\anaconda3\envs\pyqt\lib\site-packages\OpenGL\GL\shaders.py", line 226, in compileShader
    result = glGetShaderiv( shader, GL_COMPILE_STATUS )
  File "src/latebind.pyx", line 39, in OpenGL_accelerate.latebind.LateBind.__call__
  File "src/latebind.pyx", line 51, in OpenGL_accelerate.latebind.Curry.__call__
  File "D:\ProgramData\anaconda3\envs\pyqt\lib\site-packages\OpenGL\GL\VERSION\GL_2_0.py", line 268, in glGetShaderiv
    status = arrays.GLintArray.zeros( (1,))
  File "src/arraydatatype.pyx", line 219, in OpenGL_accelerate.arraydatatype.ArrayDatatype.zeros
  File "src/arraydatatype.pyx", line 224, in OpenGL_accelerate.arraydatatype.ArrayDatatype.c_zeros
  File "src/arraydatatype.pyx", line 69, in OpenGL_accelerate.arraydatatype.HandlerRegistry.c_get_output_handler
  File "src/arraydatatype.pyx", line 80, in OpenGL_accelerate.arraydatatype.HandlerRegistry.c_handler_by_plugin_name
  File "D:\ProgramData\anaconda3\envs\pyqt\lib\site-packages\OpenGL\plugins.py", line 16, in load
    return importByName( self.import_path )
  File "D:\ProgramData\anaconda3\envs\pyqt\lib\site-packages\OpenGL\plugins.py", line 38, in importByName
    module = __import__( ".".join(moduleName), {}, {}, moduleName)
  File "D:\ProgramData\anaconda3\envs\pyqt\lib\site-packages\OpenGL\arrays\numpymodule.py", line 27, in <module>
    from OpenGL_accelerate.numpy_formathandler import NumpyHandler
  File "src/numpy_formathandler.pyx", line 1, in init OpenGL_accelerate.numpy_formathandler
ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject

对比了一下旧电脑里的配置,把pyopengl-accelerate的版本换成3.1.5就好了:pip install PyOpenGL_accelerate==3.1.5 

 类似资料: