我决定尝试在 Python 中使用 OpenGL VBO 来提高 FPS。我发现代码在 Linux 操作系统 (Ubuntu) 中运行得非常好,但是当我尝试在 Windows 操作系统中启动时,代码会显示一条消息: “使用 ()、{} 的 GLUT 显示回调失败:返回 None 模块 'numpy' 没有属性 'float128'”
所以,我无法专门在 Windows 上运行代码,但因为我想创建一个跨平台应用程序,所以我确实需要解决这个问题。
我做了很多研究,只发现 numpy.float128 应该替换为 numpy.longdouble。但是,因为OpenGL VBO位于opengl_accelerate中,所以我不知道如何更改那里的用法。
这是我的整个代码。
import sys
import random #for random numbers
from OpenGL.GL import * #for definition of points
from OpenGL.GLU import *
from OpenGL.GLUT import * #for visualization in a window
import numpy as np
AMOUNT = 10
DIMENSION = 3
def changePoints(points):
for i in range(0, 3*AMOUNT):
x = random.uniform(-1.0, 1.0)
points[i]= points[i]*x
print(points)
return points
def displayPoints(points):
vbo=GLuint(0) # init the Buffer in Python!
glGenBuffers(1, vbo) # generate a buffer for the vertices
glBindBuffer(GL_ARRAY_BUFFER, vbo) #bind the vertex buffer
glBufferData(GL_ARRAY_BUFFER,sys.getsizeof(points), points, GL_STREAM_DRAW)
glBindBuffer(GL_ARRAY_BUFFER, vbo) #bind the vertex buffer
glEnableClientState(GL_VERTEX_ARRAY) # enable Vertex Array
glVertexPointer(DIMENSION, GL_FLOAT,0, ctypes.cast(0, ctypes.c_void_p))
glBindBuffer(GL_ARRAY_BUFFER, vbo) #bind the vertex buffer
glDrawArrays(GL_POINTS, 0, AMOUNT)
glDisableClientState(GL_VERTEX_ARRAY) # disable the Vertex Array
glDeleteBuffers(1, vbo)
##creates Points
def Point():
points = np.array([random.uniform(-1.0, 1.0) for _ in range(3*AMOUNT)], dtype = np.float32)
points = changePoints(points)
#Visualization
displayPoints(points)
##clears the color and depth Buffer, call Point() and swap the buffers of the current window
def display():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
Point()
glutSwapBuffers()
def main():
##initials GLUT
glutInit(sys.argv)
#sets the initial display mode (selects a RGBA mode window; selects a double buffered window; selects a window with a depth buffer)
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH)
#defines the size of the Window
glutInitWindowSize(800, 1600)
#creates a window with title
glutCreateWindow(b'Points') #!string as title is causing a error, because underneath the PyOpenGL call is an old-school C function expecting ASCII text. Solution: pass the string in byte format.
glutDisplayFunc(display) #sets the display callback for the current window.
glutMainLoop() #enters the GLUT event processing loop.
main()
这是完整的错误回溯:
Traceback (most recent call last): File "C:\Users\root\Anaconda3\lib\site-packages\OpenGL\GLUT\special.py", line 130, in safeCall return function( *args, **named ) File "C:/Users/root/Desktop/test/main3.py", line 48, in display Point() File "C:/Users/root/Desktop/test/main3.py", line 42, in Point displayPoints(points) File "C:/Users/root/Desktop/test/main3.py", line 23, in displayPoints glBufferData(GL_ARRAY_BUFFER,sys.getsizeof(points), points, GL_STREAM_DRAW) File "src/latebind.pyx", line 44, in OpenGL_accelerate.latebind.Curry.call File "C:\Users\root\Anaconda3\lib\site-packages\OpenGL\GL\VERSION\GL_1_5.py", line 86, in glBufferData data = ArrayDatatype.asArray( data ) File "src/arraydatatype.pyx", line 172, in OpenGL_accelerate.arraydatatype.ArrayDatatype.asArray File "src/arraydatatype.pyx", line 47, in OpenGL_accelerate.arraydatatype.HandlerRegistry.c_lookup File "C:\Users\root\Anaconda3\lib\site-packages\OpenGL\plugins.py", line 16, in load return importByName( self.import_path ) File "C:\Users\root\Anaconda3\lib\site-packages\OpenGL\plugins.py", line 38, in importByName module = import( ".".join(moduleName), {}, {}, moduleName) File "C:\Users\root\Anaconda3\lib\site-packages\OpenGL\arrays\numpymodule.py", line 27, in from OpenGL_accelerate.numpy_formathandler import NumpyHandler File "src/numpy_formathandler.pyx", line 55, in init OpenGL_accelerate.numpy_formathandler AttributeError: module 'numpy' has no attribute 'float128' GLUT Display callback with (),{} failed: returning None module 'numpy' has no attribute 'float128'
有没有办法在opengl_accelerate中将numpy.float128的使用更改为numpy.longdouble或使numpy.float128在Windows中工作?
最佳答案
找到可能的解决方案: 我发现 PyOpenGL 的最后一个版本本身运行良好,但是 pyopengl-accelerate 包导致了这个问题的出现。删除加速包后,一切都很好。
关于python - numpy.float128 在 Windows 中不存在,但从 OpenGL 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58686018/