1

I decided to try using OpenGL VBO in Python to improve FPS. I found code, that worked perfectly fine in Linux OS (Ubuntu), but when I tried launching in Windows OS, the code resulted in a message: "GLUT Display callback with (),{} failed: returning None module 'numpy' has no attribute 'float128'"

So, I can't run the code specifically on Windows, but because I want to create a cross-platform application, I really need to solve this.

I've done a lot of research and only found that numpy.float128 should be replaced to numpy.longdouble. However, because OpenGL VBO is in opengl_accelerate, I don't know how to change the usage there.

This is my entire code.

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()

This is the full error traceback:

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'

Is there any way of either changing the usage of numpy.float128 to numpy.longdouble in opengl_accelerate or making numpy.float128 work in windows?

0

1 Answer 1

4

Found possible solution: I found out that PyOpenGL’s last version works fine itself, however, it’s pyopengl-accelerate package that causes this issue to appear. After I removed the acceleration package everything world fine.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.