Python LWJGL和PyOpenGL中为opengl代码提供参数的差异
我正在用python学习opengl,并学习本课程 他正在使用LWJGL,我是PyOpengl。我注意到他的一些方法(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
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 )