numpy.float128 在 windows 中不存在,但从 OpenGL 调用

Posted

技术标签:

【中文标题】numpy.float128 在 windows 中不存在,但从 OpenGL 调用【英文标题】:numpy.float128 doesn't exist in windows, but is called from OpenGL 【发布时间】:2020-02-29 07:58:20 【问题描述】:

我决定尝试在 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(最近一次调用最后一次): 文件“C:\Users\root\Anaconda3\lib\site-packages\OpenGL\GLUT\special.py”,第 130 行,在 safeCall 返回函数(*args, **named) 文件“C:/Users/root/Desktop/test/main3.py”,第 48 行,显示 观点() 文件“C:/Users/root/Desktop/test/main3.py”,第 42 行,在 Point 显示点(点) 文件“C:/Users/root/Desktop/test/main3.py”,第 23 行,在 displayPoints glBufferData(GL_ARRAY_BUFFER,sys.getsizeof(点),点,GL_STREAM_DRAW) OpenGL_accelerate.latebind.Curry 中的文件“src/latebind.pyx”,第 44 行。调用 文件“C:\Users\root\Anaconda3\lib\site-packages\OpenGL\GL\VERSION\GL_1_5.py”,第 86 行,在 glBufferData 数据 = ArrayDatatype.asArray( 数据 ) 文件“src/arraydatatype.pyx”,第 172 行,在 OpenGL_accelerate.arraydatatype.ArrayDatatype.asArray OpenGL_accelerate.arraydatatype.HandlerRegistry.c_lookup 中的文件“src/arraydatatype.pyx”,第 47 行 文件“C:\Users\root\Anaconda3\lib\site-packages\OpenGL\plugins.py”,第 16 行,加载中 返回 importByName(self.import_path) importByName 中的文件“C:\Users\root\Anaconda3\lib\site-packages\OpenGL\plugins.py”,第 38 行 module = 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 显示回调失败:返回 None 模块“numpy”没有属性“float128”

有什么方法可以在 opengl_accelerate 中将 numpy.float128 的用法更改为 numpy.longdouble 或使 numpy.float128 在 Windows 中工作?

【问题讨论】:

【参考方案1】:

找到可能的解决方案: 我发现 PyOpenGL 的最后一个版本本身可以正常工作,但是,它是 pyopengl-accelerate 包导致出现此问题。在我删除加速包后一切正常。

【讨论】:

以上是关于numpy.float128 在 windows 中不存在,但从 OpenGL 调用的主要内容,如果未能解决你的问题,请参考以下文章

python numpy错误“TypeError:'numpy.float64'对象不能解释为整数”

numpy 引发错误:TypeError:无法推断类型的架构:<class 'numpy.float64'>

TypeError:“numpy.float32”类型的对象没有 len()

逻辑回归 - numpy.float64

TypeError:“numpy.float64”对象不可调用 - 打印 F1 分数时

ErlangC 函数应用程序错误 - TypeError: 'numpy.float64' object is not iterable