Я решил попробовать использовать OpenGL VBO в Python для улучшения FPS. Я обнаружил код, который прекрасно работал в ОС Linux (Ubuntu), но когда я попытался запустить его в ОС Windows, код привел к сообщению: «Сбой обратного вызова GLUT Display с (), {}: возвращение Нет Модуль« 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 (последний вызов был последним): файл "C: \ Users \ root \ Anaconda3 \ lib \ site-packages \ OpenGL \ GLUT \ special.py", строка 130, в функции возврата safeCall (* args, ** named) Файл "C: /Users/root/Desktop/test/main3.py", строка 48, в отображении Point () Файл "C: /Users/root/Desktop/test/main3.py", строка 42, в файле Point displayPoints (points) файла «C: /Users/root/Desktop/test/main3.py», строка 23, в файле displayPoints glBufferData (GL_ARRAY_BUFFER, sys.getsizeof (points), points, GL_STREAM_DRAW) Файл »src / latebind.pyx ", строка 44, в OpenGL_accelerate.latebind.Curry. call Файл" C: \ Users \ root \ Anaconda3 \ lib \ site-packages \ OpenGL \ GL \ VERSION \ GL_1_5.py", строка 86, в файле glBufferData data = ArrayDatatype.asArray (data)" src / arraydatatype.pyx ", строка 172, в файле OpenGL_accelerate.arraydatatype.ArrayDatatype.asArray«src / arraydatatype.pyx», строка 47, в файле OpenGL_accelerate.arraydatatype.HandlerRegistry.c_lookup. «C: \ Users \ root \ Anaconda3 \ lib \ site-packages \ OpenGL \ plugins.py», строка 16, при загрузке возвращает importByName(self.import_path) Файл "C: \ Users \ root \ Anaconda3 \ lib \ site-packages \ OpenGL \ plugins.py", строка 38, в модуле importByName = import (".". join (moduleName), {}, {}, moduleName) Файл "C: \ Users \ root \ Anaconda3 \ lib \ site-packages \ OpenGL \ arrays \ numpymodule.py", строка 27, из файла OpenGL_accelerate.numpy_formathandler, импорт из файла NumpyHandler "src"/numpy_formathandler.pyx ", строка 55, в init OpenGL_accelerate.numpy_formathandler AttributeError: модуль 'numpy' не имеет атрибута 'float128' GLUT Показать обратный вызов с помощью (), {} не удалось: возврат ни одного модуля 'numpy' не имеет атрибута 'float128'
Есть ли способ изменить использование numpy.float128 на numpy.longdouble в opengl_accelerate или заставить работать numpy.float128 в windows?