osg.BufferData
类代表了一个缓冲区对象,可以用于存储任意类型的数据。
osg::BufferData::BufferData(GLenum dataType, GLenum usageHint = GL_DYNAMIC_DRAW);
参数:
dataType
:缓冲区数据类型,例如 GL_FLOAT
、GL_UNSIGNED_BYTE
等。usageHint
:缓冲区用途提示,例如 GL_STATIC_DRAW
、GL_DYNAMIC_DRAW
等。void setNumElements(unsigned int num);
设置缓冲区元素数量。每个元素的大小由 dataType
决定。
void setData(const void* data, unsigned int size, unsigned int offset = 0);
将缓冲区数据设置为给定数据。data
参数是指向数据的指针,size
是数据大小,offset
是偏移量。
void* map(GLenum access);
映射缓冲区到 CPU 内存中,并返回一个指向映射区域的指针。access
参数表示 CPU 可以对映射区域进行的访问权限,例如 GL_READ_ONLY
、GL_WRITE_ONLY
等。
void unmap();
解除缓冲区和 CPU 内存的映射关系。
GLenum getDataType() const;
返回缓冲区数据类型。
GLenum getUsageHint() const;
返回缓冲区用途提示。
unsigned int getNumElements() const;
返回缓冲区元素数量。
unsigned int getElementSize() const;
返回每个元素的大小。
unsigned int getTotalSize() const;
返回缓冲区总大小。
bool isMapped() const;
返回缓冲区是否被映射到 CPU 内存中。
osg::BufferData* bufferData = new osg::BufferData(GL_FLOAT, GL_STATIC_DRAW);
bufferData->setNumElements(3);
float data[3] = {1.0f, 2.0f, 3.0f};
bufferData->setData(data, 3 * sizeof(float));
float* mappedData = static_cast<float*>(bufferData->map(GL_WRITE_ONLY));
mappedData[2] = 4.0f;
bufferData->unmap();