【问题标题】:difference in giving parameters to opengl code in LWJGL and PyOpenGL在 LWJGL 和 PyOpenGL 中为 opengl 代码提供参数的区别
【发布时间】:2021-04-16 11:15:33
【问题描述】:

我正在使用 python 学习 opengl。并遵循本课程 https://www.youtube.com/watch?v=WMiggUPst-Q&list=PLRIWtICgwaX0u7Rf9zkZhLoLuZVfUksDP&index=2 只是为了能够做到。他正在使用 LWJGL,我是 PyOpengl。我注意到他的一些方法(glgenVertexArraygldeleteVertexArray ...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


    【解决方案1】:

    OpenGL 4.6 API Core Profile Specification - 10.3.1 Vertex Array Objects

    void DeleteVertexArrays( sizei n, const uint *arrays );
    

    请参阅 PyOpneGL - glDeleteVertexArrays:

    签名

    glDeleteVertexArrays( GLsizei ( n ) , const GLuint *( arrays ) )-> void
       def glDeleteVertexArrays( n , arrays )
    

    第二个参数必须是元素类型为“unit”的数组:

    def CleanUP():
         np_vaos = np.array([vao], dtype="uint")
         glDeleteVertexArrays(np_vaos.size, np_vaos)
    

    然而,在较新的 PyOpenGL 版本中,第二个参数也可以是一个列表:

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

    使用 LWJGL 时,大小参数 (n) 是从 Java 数组对象推导出来的。不同语言的不同库为 OpenGL API 函数提供不同的重载。如果某个函数的行为异常且与 OpenGL 规范不同,您必须查阅这些库的 API 文档。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    相关资源
    最近更新 更多