python glDrawElements方法不使用索引和顶点绘制

g52tjvyc  于 2023-02-03  发布在  Python
关注(0)|答案(2)|浏览(129)

我尝试使用glDrawElements方法在屏幕上绘制一个四边形,如下所示:

glDrawElements(GL_TRIANGLES, model.get_vertex_count(), GL_UNSIGNED_INT, 0)

为了获得索引,我编写了以下方法:

@classmethod
    def bind_indices_buffer(cls, indices: list[int]):
        indices = numpy.array(indices, dtype=numpy.uint32)  # convert the data into an unsigned integer array
        vbo_id = glGenBuffers(1)
        cls.__vbos.append(vbo_id)
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo_id)
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices, GL_STATIC_DRAW)

对于顶点:

@classmethod
    def store_data_in_attribute_list(cls, attribute_number: int, data: list[float]):
        data = numpy.array(data, dtype='float32')   # convert the data into a float32 array
        vbo_id = glGenBuffers(1)                    # create 1 VBO buffer
        cls.__vbos.append(vbo_id)                   # appends it to the VBO list in the class
        glBindBuffer(GL_ARRAY_BUFFER, vbo_id)       # binds the buffer to use it
        glBufferData(GL_ARRAY_BUFFER, data, GL_STATIC_DRAW)  # specifies the buffer, data and usage
        glVertexAttribPointer(attribute_number, 3, GL_FLOAT, False, 0, None)  # put the VBO into a VAO
        glBindBuffer(GL_ARRAY_BUFFER, 0)

如果你想看到其余的代码,我已经粘贴到我的最后一个问题,这些片段是唯一的变化

agxfikkp

agxfikkp1#

glDrawElements的lase参数的类型为const GLvoid *,因此参数必须为Nonectypes.c_void_p(0),但不能为0:
glDrawElements(GL_TRIANGLES, model.get_vertex_count(), GL_UNSIGNED_INT, 0)

glDrawElements(GL_TRIANGLES, model.get_vertex_count(), GL_UNSIGNED_INT, None)
aamkag61

aamkag612#

我承认我的OpenGL有点生疏,但是IIRC glDrawElements在最后一个参数中需要一个指向索引列表的指针(参见https://registry.khronos.org/OpenGL-Refpages/gl4/html/glDrawElements.xhtml,我不知道如何在Python中处理这个问题)。如果您只想绘制所有顶点,请尝试glDrawArrays( GL_TRIANGLES, 0, model.get_vertex_count() )(参见https://registry.khronos.org/OpenGL-Refpages/gl4/html/glDrawArrays.xhtml)。
编辑:我错了,感谢@Rabbid76的澄清。glDrawArrays将从已启用的数组中按顺序(vertex[0],vertex[1],vertex[2],...)取出给定数量的顶点,而glDrawElements将使用索引数组查找它们(vertex[index[0]],vertex[index[1]],...)等等。

相关问题