可移植地将数据装入缓冲区

Packing data into a buffer portably

本文关键字:装入 缓冲区 数据 可移植      更新时间:2023-10-16

我必须将几个整数值放入(32字节)缓冲区,其中每个整数必须位于缓冲区中的特定位置(我将使用OpenGL VBOs中的数据)。

我现在做的方式有点难看。所有的内容应该放在地址buf2。不要费心去看我分配给缓冲区的值,因为这些值与问题无关。

    uint32_t *const coords      = reinterpret_cast<uint32_t *>(buf2 + CoordDataOff);
    uint16_t *const texcoords   = reinterpret_cast<uint16_t *>(buf2 + TcoordDataOff);
    uint32_t *const color       = reinterpret_cast<uint32_t *>(buf2 + ColorDataOff);
    coords[0] = x + bearing[0]; // left
    coords[1] = y + bearing[1] - 64*(tcoords[3] - tcoords[1]); // bottom
    coords[2] = x + bearing[0] + 64*(tcoords[2] - tcoords[0]); // right
    coords[3] = y + bearing[1]; // top
    copy_n(tcoords, 4, texcoords);
    *color = c.color;

有没有更好的、可移植的方法来完成它?

缓冲区是否只包含每个顶点的数据?你可以直接生成一个struct

struct TData
{
  uint32_t coords[4];
  uint16_t texcoords[4];
  uint32_t color;
};

,那么它就像把你的缓冲区当作TData

数组一样简单。
TData verts[100];
vert[0].coord[0] = x;
vert[0].coord[1] = y;
...
FunctionToWriteToBuffer((void *)verts, sizeof(TData) * 100);

或者上面的代码

  TData *vert = (TData *)buf2;

这也应该使内容更容易阅读和维护