osg.PixelDataBufferObject类是一个用于存储像素数据的缓冲区对象。它通常用于离屏渲染和后期处理任务中。
osg::Object
    osg::BufferObject
        osg::PixelDataBufferObject
osg::PixelDataBufferObject 继承自 osg::BufferObject 和 osg::Object。
PixelDataBufferObject(unsigned int contextID = 0, GLenum usage = GL_STREAM_DRAW);
构造函数有两个参数,默认参数为 0 和 GL_STREAM_DRAW。contextID 表示OpenGL上下文ID,usage 表示缓冲区的使用方式。
void * map(GLenum access)映射缓冲区,返回数据指针。
参数 access 可选值包括 GL_READ_ONLY、GL_WRITE_ONLY 和 GL_READ_WRITE,指定读写缓冲区的权限。
void unmap()解除缓冲区的映射。
void copyPixelsFromImage(const osg::Image & image, unsigned int rowLength = 0, unsigned int imageHeight = 0)从 osg::Image 对象中复制像素数据到缓冲区对象。
参数 rowLength 和 imageHeight 可选,用于指定每行像素数据的长度和图像的高度。
void copyPixelsToImage(osg::Image & image)将缓冲区对象中的像素数据复制到 osg::Image 对象中。
ImageData getImageData(unsigned int offset, unsigned int width, unsigned int height, GLenum format, GLenum type)从缓冲区对象中获取像素数据,并封装为 osg::ImageData 对象返回。
参数 offset 表示从缓冲区的哪个位置开始获取像素数据,width 和 height 分别表示宽度和高度,format 和 type 分别指定像素数据的格式和类型。
void setImageData(unsigned int offset, const ImageData & imageData)将 osg::ImageData 对象中的像素数据存储到缓冲区对象中。
参数 offset 表示从缓冲区的哪个位置开始存储像素数据。
void read(void * data, unsigned int size, unsigned int offset) const读取缓冲区对象中指定位置的数据。
参数 data 为数据缓冲区的指针,size 表示要读取的数据大小,offset 表示从缓冲区的哪个位置开始读取数据。
void write(const void * data, unsigned int size, unsigned int offset)将指定的数据写入缓冲区对象的指定位置。
参数 data 为数据缓冲区的指针,size 表示要写入的数据大小,offset 表示从缓冲区的哪个位置开始写入数据。
#include <osg/PixelDataBufferObject>
#include <osg/Image>
#include <iostream>
int main()
{
    // 创建一个 256 x 256 的 RGBA 图像
    osg::ref_ptr<osg::Image> image = new osg::Image;
    image->allocateImage(256, 256, 1, GL_RGBA, GL_UNSIGNED_BYTE);
    unsigned char* data = image->data();
    for (int i = 0; i < 256 * 256 * 4; i += 4)
    {
        data[i] = 255;
        data[i + 1] = 0;
        data[i + 2] = 0;
        data[i + 3] = 255;
    }
    // 创建一个像素数据缓冲区对象
    osg::ref_ptr<osg::PixelDataBufferObject> pbo = new osg::PixelDataBufferObject;
    // 将图像数据复制到缓冲区对象中
    pbo->copyPixelsFromImage(*image);
    // 从缓冲区对象中读取数据并检查
    unsigned char pixels[256 * 256 * 4];
    pbo->read(pixels, sizeof(pixels), 0);
    bool success = true;
    for (int i = 0; i < 256 * 256 * 4; i += 4)
    {
        if (pixels[i] != 255 || pixels[i + 1] != 0 || pixels[i + 2] != 0 || pixels[i + 3] != 255)
        {
            success = false;
            break;
        }
    }
    std::cout << "Read test " << (success ? "passed" : "failed") << std::endl;
    return 0;
}