Python LWJGL和PyOpenGL中为opengl代码提供参数的差异

Python LWJGL和PyOpenGL中为opengl代码提供参数的差异,python,python-3.x,opengl,pyopengl,Python,Python 3.x,Opengl,Pyopengl,我正在用python学习opengl,并学习本课程 他正在使用LWJGL,我是PyOpengl。我注意到他的一些方法(glgenVertexArray,gldeleteVertexArray…ex)使用时没有参数,即使docs另有说明。虽然我用python编写了相同的代码,但是 GLGEnVertexArray需要1个参数(n个,数组),收到0:() 它需要我为同一方法提供一个参数。这里(我认为)给1不是问题,但是当它涉及到glDeleteVertexArrays时,如果我不给1,并且我保留va

我正在用python学习opengl,并学习本课程 他正在使用LWJGL,我是PyOpengl。我注意到他的一些方法(
glgenVertexArray
gldeleteVertexArray
…ex)使用时没有参数,即使docs另有说明。虽然我用python编写了相同的代码,但是

GLGEnVertexArray需要1个参数(n个,数组),收到0:()

它需要我为同一方法提供一个参数。这里(我认为)给1不是问题,但是当它涉及到
glDeleteVertexArrays
时,如果我不给1,并且我保留vao的列表,vbo ID会引发这个问题

回溯(最近一次呼叫最后一次): 文件“C:\Users\TheUser\AppData\Local\Programs\Python 38-32\lib\site packages\OpenGL\latebind.py”,第43行,在调用中 返回自我。_finalCall(*args,**已命名) TypeError:“非类型”对象不可调用

在处理上述异常期间,发生了另一个异常: 回溯(最近一次呼叫最后一次): 文件“C:/Users/TheUser/Desktop/MyPytonDen/thinmarixopengl/engineTester/MainGameLoop.py”,第22行,在 Loader.CleanUP() 文件“C:\Users\TheUser\Desktop\MyPytonDen\thinmarixopengl\renderEngine\Loader.py”,第12行,在清理中 glDeleteVertexArrays() 文件“C:\Users\TheUser\AppData\Local\Programs\Python 38-32\lib\site packages\OpenGL\latebind.py”,第47行,在调用中 返回自我。_finalCall(*args,**已命名) wrapperCall中第689行的文件“C:\Users\TheUser\AppData\Local\Programs\Python\Python38-32\lib\site packages\OpenGL\wrapper.py” pyArgs=元组(计算_pyArgs(args)) 文件“C:\Users\TheUser\AppData\Local\Programs\Python38-32\lib\site packages\OpenGL\wrapper.py”,第436行,在calculate\u pyArgs中 升值误差( ValueError:GLDeleteVertexArray需要2个参数(n,数组),收到0:()

我照我说的去做,但我认为这不合适。 所以我想问它到底想从我这里得到什么(文档对我来说不够明确),为什么它想要PyOpenGl而不是LWJGL

这是文件:

from ThinMatrixOpenGl.renderEngine.RawModel import RawModel
from OpenGL.GL import *
import numpy as np

VAOs = []
VBOs = []

def CleanUP():
     print(VAOs, VBOs)
     for vao in VAOs:
     glDeleteVertexArrays(int(vao), VAOs)

for vbo in VBOs:
     glDeleteBuffers(int(vbo), VBOs)

def LoadToVao(positions):
     global VAOs
     VAO_ID = CreateVao()
     VAOs.append(VAO_ID)
     storeDataInAttribList(0, positions)
     unbindVao()
     return RawModel(vao_id=VAO_ID, vertex_count=(len(positions) / 3))

def CreateVao():
     VAO_ID = glGenVertexArrays(1)
     glBindVertexArray(VAO_ID)
     return VAO_ID

def storeDataInAttribList(attrib_number: int, data: float):
     global VBOs
     VBO_id = glGenBuffers(1)
     VBOs.append(VBO_id)
     glBindBuffer(GL_ARRAY_BUFFER, VBO_id)
     buffer = StoreDataInFloatBuffer(data)
     glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW)
     glVertexAttribPointer(attrib_number, 3, GL_FLOAT, GL_FALSE, 0, None)
     glBindBuffer(GL_ARRAY_BUFFER, 0)

def unbindVao():
     glBindVertexArray(0)

def StoreDataInFloatBuffer(data: float):
     buffer = np.array(data, dtype=np.float32)
     return buffer

请参见PyOpneGL-
glDeleteVertexArrays

签名

glDeleteVertexArrays( GLsizei ( n ) , const GLuint *( arrays ) )-> void
   def glDeleteVertexArrays( n , arrays )
第二个参数必须是元素类型为“unit”的数组:

def CleanUP():
np_vaos=np.array([vao],dtype=“uint”)
GLDeleteVertexArray(np_vaos.size,np_vaos)
但是,在较新的PyOpenGL版本中,第二个参数也可以是列表:

def CleanUP():
GLdeleteVertexArray(len(VAOs),VAOs)

使用LWJGL时,size参数(n)是从Java数组对象推导出来的。不同语言的不同库为OpenGL API函数提供了不同的重载。如果函数的行为意外且与OpenGL规范不同,则必须查阅库的API文档。

谢谢!因此它最多只能由API自己实现。我认为对于genbuffer和deletebuffers@AAAA是的,看到了吗
glDeleteVertexArrays( GLsizei ( n ) , const GLuint *( arrays ) )-> void
   def glDeleteVertexArrays( n , arrays )