2012-01-03 1 views
0

Мне нужно поместить несколько целых значений в буфер (32 байт), где каждое целое число должно находиться в определенном месте в буфере (я собираюсь использовать данные в VBOs OpenGL).Упаковывание данных в буфер портально

То, как я делаю это сейчас, выглядит довольно уродливым. Все содержимое должно размещаться по адресу 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; 

Есть ли какой-нибудь приятный, переносимый способ его достижения?

ответ

2

Имеет ли ваш буфер только эти данные для каждой вершины? Вы можете просто сгенерировать-структуру

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; 

Это также должно упростить чтение для поддержания

+1

Ваша 'структура', скорее всего, введет 2 байта заполнения до или после' t excoords'. В стандарте C++ не указывается, где. Вы можете явно добавить дополнение, но с учетом неопределенных ограничений памяти OP это может не сработать. –

+0

У него, похоже, есть только одна TData, и у TData есть 4 texcoords. –

+0

извините, да, я думал о #pragma pack(), когда я печатал ответ, но забыл включить его. Очень важно, чтобы вы это делали. Последняя строка кода, который я вставил, должна быть в порядке для использования в вопросе (в зависимости от значений CoordDataOff, TcoordDataOff, ColorDataOff). Но я думаю, есть и такой же код, который будет заполнять VBO. Использование одной и той же структуры для чтения и записи в буфер должно облегчить задачу. – noggin182

Смежные вопросы