在PyOpenGL调用中使用偏移量到缓冲区中。

| 在OpenGL中,根据是否使用
GL_ELEMENT_ARRAY_BUFFER
glDrawElements
的ѭ0depending参数具有两种不同的含义。 如果您绑定了VBO,则它是从该缓冲区开始的偏移量,而不是缓冲区本身。 使用PyOpenGL时,如何指定在
glDrawElements
调用中开始的偏移量?如何在
glMultiDrawElements
调用中指定多个起始偏移量?     
已邀请:
        在以下示例中,使用了6个索引的列表,它们可以形成一个由2个三角形图元组成的四边形。
indices = [0, 1, 2, 0, 2, 3]
由于传递给OpenGL函数的数据必须由相干缓冲区中的固定大小单位组成,因此值列表必须存储到浮点数组中。 可以通过ctypes库或
numpy.array
库创建相干数组缓冲区。 数组元素的类型必须与值类型枚举器常量匹配,该常量是在调用
glDrawElements
glMultiDrawElements
时设置的:
ctypes.c_ubyte   /  numpy.uint8     <->    GL_UNSIGNED_BYTE
ctypes.c_ushort  /  numpy.uint16    <->    GL_UNSIGNED_SHORT
ctypes.c_uint    /  numpy.uint32    <->    GL_UNSIGNED_INT
使用
ctypes
import ctypes

indexArray = (ctypes.c_uint * 6)(*indices)
使用
numpy
import numpy

indexArray = numpy.array(indices, dtype=numpy.uint32)
使用索引缓冲区和“ 1”存在不同的机会。 使用旧版OpenGL(兼容性配置文件xontext),缓冲区可以直接传递到
glDrawElements
。指向数组数据的指针将传递给该函数。
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, indexArray)
如果在顶点数组对象中声明了命名元素数组缓冲区对象,则将最后一个参数“ 1”视为缓冲区对象数据存储区中的字节偏移量。
glBindVertexArray(vao)

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexArray, GL_STATIC_DRAW)
如果应该从缓冲区的第一个元素开始绘制索引,则最后一个参数可以是
None
,它等效于
ctypes.c_void_p(0)
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, None)
如果图形不应该从第一个索引开始,则必须计算起始索引的字节偏移量。例如对于类型为23的缓冲区,322ѭ将起始位置设置为3索引:
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, ctypes.c_void_p(3 * 4))
glMultiDrawElements
的用法非常相似。 使用兼容性配置文件xontext,可以将缓冲区指针直接传递给OpenGL函数。 要生成索引数组: 使用
ctypes
indexArray1 = (ctypes.c_uint * 3)(0, 1, 2)
indexArray2 = (ctypes.c_uint * 3)(0, 2, 3)
使用
numpy
indexArray1 = numpy.array([0, 1, 2], dtype=numpy.uint32)
indexArray2 = numpy.array([0, 2, 3], dtype=numpy.uint32)
指向缓冲区的指针必须安排在一个指针数组中: 使用
ctypes
指向索引数据数组的指针由
ctypes.addressof()
获得:
indexPtr = (ctypes.c_void_p * 2)(ctypes.addressof(indexArray1),ctypes.addressof(indexArray2))
使用
numpy
指向索引数据数组的指针由
numpy.ndarray.ctypes
获得:
indexPtr = numpy.array([indexArray1.ctypes.data, indexArray2.ctypes.data], dtype=numpy.intp)
可以将以下指针数组传递给OpenGL函数:
counts   = [3, 3]
glMultiDrawElements(GL_TRIANGLES, counts, GL_UNSIGNED_INT, indexPtr, 2)
如果使用具有命名元素数组缓冲区的顶点数组对象,
glBindVertexArray(vao)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo)
然后将index参数视为指向字节偏移量数组的指针。接下来,将具有2个偏移量的数组传递给该函数。 0标识数组中的第一个索引,3 * 4标识数组中的第三个索引。 使用
ctypes
indexPtr = (ctypes.c_void_p * 2)(0, 3 * 4)
counts   = [3, 3]
glMultiDrawElements(GL_TRIANGLES, counts, GL_UNSIGNED_INT, indexPtr, 2)
使用
numpy
indexPtr = np.array([0, 3*4], dtype=numpy.intp)
counts   = [3, 3]
glMultiDrawElements(GL_TRIANGLES, counts, GL_UNSIGNED_INT, indexPtr, 2)
    

要回复问题请先登录注册