glBufferData用0分隔数据

2024-10-01 13:33:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试将索引加载到GL_ELEMENT_ARRAY_BUFFER,但当我尝试此操作时,它会将数据与0分开

例如,我加载了以下数据:

[0 1 3 3 1 2]

使用函数glBufferData(查看下面的代码示例)。当我用glGenBufferSubData请求缓冲区中的数据时,此函数返回以下内容:

[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个数字。有人知道发生了什么事吗


Tags: 数据函数代码selfnumpy示例bufferelement
2条回答

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字节的内存。因为^{}中的size参数是以字节为单位的大小,所以该参数必须是12


[...] when I try this it separates my data with 0's [...]

^{}读取缓冲区的字节值并返回uint8值数组。因此,12个字节中的每个字节都被视为一个单独的8位(unit8)值,这就是打印的内容

如果您想获得“原始”int16值,那么您必须通过^{}重新解释数组

uint8_data = glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, 12)
int16_data = numpy.frombuffer(uint8_data, dtype=numpy.int16)
print(int16_data)

或者,可以将指向int16数组的数据指针视为unit8数据指针(请参见^{}):

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 6个数字,每个数字都是16位整数(numpy.int16),即每个数字占用2个字节。打印时,字节是单独打印的,因此可以看到12个单独的数字。您可以确认/尝试给出大于255的总帐编号,即它们的最高有效字节将不再为零

同样有趣的是,这些数字似乎是用低端格式写的,即先写最低有效字节。所以如果你写int16300,你应该在单字节输出中看到[... 44 1 ...],因为44 + 1 * 256 = 300

相关问题 更多 >