glBufferData 用 0 分隔数据
glBufferData seperates data with 0
我尝试将我的索引加载到一个 GL_ELEMENT_ARRAY_BUFFER
中,但是当我尝试这样做时它用 0 分隔我的数据。
所以例如我加载了这个数据:
[0 1 3 3 1 2]
与函数 glBufferData
(查看下面的代码示例)。当我使用 glGenBufferSubData
请求缓冲区中的数据时,此函数 returns 如下:
[0 0 1 0 3 0 3 0 1 0 2 0].
def __bindIndicesBuffer__(self, indices):
vboID = glGenBuffers(1)
self.vbos.append(vboID)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboID)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 12, numpy.array(indices, dtype = numpy.int16), GL_STATIC_DRAW)
print(glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, 12))
在函数glBufferData
中我必须保留12个字节的数据,这很奇怪因为我只有6个数字。有人知道发生了什么事吗?
您给 GL 6 个数字,每个数字一个 16 位整数 (numpy.int16
),即每个数字占用 2 个字节。打印时,字节是单独打印的,因此您会看到 12 个单独的数字。您可以确认/试验给出大于 255 的 GL 数字,即它们的最高有效字节将不再为零。
同样有趣的是——这些数字似乎是以低端格式编写的,即最低有效字节在前。所以如果你写 int16
300,你 应该 在单字节输出中看到 [... 44 1 ...]
,因为 44 + 1 * 256 = 300
.
In the function glBufferData
I have to reserve 12 bytes of data, which is weird because I only have 6 numbers [...]
当然,你们每个数字都是int16
类型的,也就是说每个数字有16位,分别是2字节(1字节有8位)。 6 个 2 个字节的数字需要 12 个字节的内存。由于 glBufferData
中的大小参数是以字节为单位的大小,因此参数必须为 12。
[...] when I try this it separates my data with 0's [...]
glGetBufferSubData
读取缓冲区的字节值和 returns 一个 uint8
值的数组。所以这 12 个字节中的每一个都被视为一个单独的 8 位 (unit8
) 值,这就是打印的内容。
如果你想获得 "orginal" int16
值,那么你必须通过 numpy.frombuffer
重新解释数组
uint8_data = glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, 12)
int16_data = numpy.frombuffer(uint8_data, dtype=numpy.int16)
print(int16_data)
或者,您可以将指向 int16
数组的数据指针视为 unit8
数据指针(参见 numpy.ndarray.ctypes
):
int16_data = numpy.empty([6], dtype=numpy.int16)
unit8_ptr = int16_data.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, 12, unit8_ptr)
print(int16_data)
我尝试将我的索引加载到一个 GL_ELEMENT_ARRAY_BUFFER
中,但是当我尝试这样做时它用 0 分隔我的数据。
所以例如我加载了这个数据:
[0 1 3 3 1 2]
与函数 glBufferData
(查看下面的代码示例)。当我使用 glGenBufferSubData
请求缓冲区中的数据时,此函数 returns 如下:
[0 0 1 0 3 0 3 0 1 0 2 0].
def __bindIndicesBuffer__(self, indices):
vboID = glGenBuffers(1)
self.vbos.append(vboID)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboID)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 12, numpy.array(indices, dtype = numpy.int16), GL_STATIC_DRAW)
print(glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, 12))
在函数glBufferData
中我必须保留12个字节的数据,这很奇怪因为我只有6个数字。有人知道发生了什么事吗?
您给 GL 6 个数字,每个数字一个 16 位整数 (numpy.int16
),即每个数字占用 2 个字节。打印时,字节是单独打印的,因此您会看到 12 个单独的数字。您可以确认/试验给出大于 255 的 GL 数字,即它们的最高有效字节将不再为零。
同样有趣的是——这些数字似乎是以低端格式编写的,即最低有效字节在前。所以如果你写 int16
300,你 应该 在单字节输出中看到 [... 44 1 ...]
,因为 44 + 1 * 256 = 300
.
In the function
glBufferData
I have to reserve 12 bytes of data, which is weird because I only have 6 numbers [...]
当然,你们每个数字都是int16
类型的,也就是说每个数字有16位,分别是2字节(1字节有8位)。 6 个 2 个字节的数字需要 12 个字节的内存。由于 glBufferData
中的大小参数是以字节为单位的大小,因此参数必须为 12。
[...] when I try this it separates my data with 0's [...]
glGetBufferSubData
读取缓冲区的字节值和 returns 一个 uint8
值的数组。所以这 12 个字节中的每一个都被视为一个单独的 8 位 (unit8
) 值,这就是打印的内容。
如果你想获得 "orginal" int16
值,那么你必须通过 numpy.frombuffer
uint8_data = glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, 12)
int16_data = numpy.frombuffer(uint8_data, dtype=numpy.int16)
print(int16_data)
或者,您可以将指向 int16
数组的数据指针视为 unit8
数据指针(参见 numpy.ndarray.ctypes
):
int16_data = numpy.empty([6], dtype=numpy.int16)
unit8_ptr = int16_data.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, 12, unit8_ptr)
print(int16_data)