【发布时间】:2021-04-16 11:15:33
【问题描述】:
我正在使用 python 学习 opengl。并遵循本课程
https://www.youtube.com/watch?v=WMiggUPst-Q&list=PLRIWtICgwaX0u7Rf9zkZhLoLuZVfUksDP&index=2
只是为了能够做到。他正在使用 LWJGL,我是 PyOpengl。我注意到他的一些方法(glgenVertexArray,gldeleteVertexArray ...ex)在没有参数的情况下使用,即使文档另有说明。虽然我在 python 中编写了相同的代码,但它说
glGenVertexArrays 需要 1 个参数(n, 数组),接收到 0: ()
它想要我为相同的方法提供一个参数。这不是问题(我认为)给 1 但是当它来到glDeleteVertexArrays 时,如果我不给 1 并且我保留 vao 的列表,vbo ids 它会引发这个
Traceback(最近一次调用最后一次): 调用中的文件“C:\Users\TheUser\AppData\Local\Programs\Python\Python38-32\lib\site-packages\OpenGL\latebind.py”,第 43 行 return self._finalCall( *args, **named ) TypeError: 'NoneType' 对象不可调用
在处理上述异常的过程中,又出现了一个异常: 回溯(最近一次通话最后): 文件“C:/Users/TheUser/Desktop/MyPytonDen/ThinMatrixOpenGl/engineTester/MainGameLoop.py”,第 22 行,在 Loader.CleanUP() CleanUP 中的文件“C:\Users\TheUser\Desktop\MyPytonDen\ThinMatrixOpenGl\renderEngine\Loader.py”,第 12 行 glDeleteVertexArrays() 调用中的文件“C:\Users\TheUser\AppData\Local\Programs\Python\Python38-32\lib\site-packages\OpenGL\latebind.py”,第 47 行 return self._finalCall( *args, **named ) wrapperCall 中的文件“C:\Users\TheUser\AppData\Local\Programs\Python\Python38-32\lib\site-packages\OpenGL\wrapper.py”,第 689 行 pyArgs = 元组(calculate_pyArgs(args)) 文件“C:\Users\TheUser\AppData\Local\Programs\Python\Python38-32\lib\site-packages\OpenGL\wrapper.py”,第 436 行,在 calculate_pyArgs 引发价值错误( ValueError: glDeleteVertexArrays 需要 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
【问题讨论】:
标签: python python-3.x opengl pyopengl