В графическом программировании очень распространена работа с форматами вершин. Это описано, например, здесь .
Однако я ищу способ выполнить sh то, что не вызывает неопределенное поведение (я в основном ищу информацию C ++ , но C тоже подойдет).
Обычный способ сделать это так: сначала объявите формат вашей вершины как структуру.
struct Vertex {
float x;
float y;
uint16_t someData;
float etc;
};
Затем вы создайте их массив, заполните их и отправьте в свой графический API (например, OpenGL).
Vertex myVerts[100];
myVerts[0].x = 42.0;
// etc.
// when done, send the data along:
graphicsApi_CreateVertexBuffer(&myVerts[0], ...);
(В стороне: я пропустил ту часть, где вы сообщаете API, какой формат; мы просто предположим, что он знает).
Однако графический API не знает о вашей структуре. Ему просто нужна последовательность значений в памяти, что-то вроде:
|<--- first vertex -->||<--- second vertex -->| ...
[float][float][u16][float][float][float][u16][float] ...
И благодаря проблемам упаковки и выравнивания нет никакой гарантии, что myVerts
будет таким образом размещен в памяти.
Конечно, тонны кода написаны таким образом, и это работает, несмотря на то, что не является переносимым .
Но есть ли любой переносимый способ сделать это не то, что
1. Inefficient
2. Awkward to write
?
Это в основном проблема сериализации. См. Также: Правильный, переносимый способ интерпретации буфера как структуры
Основной совместимый со стандартами способ, который я знаю, заключается в выделении вашей памяти как char[]
. Затем вы просто заполняете все байты в точности так, как вы хотите, чтобы они были расположены.
Но для преобразования из представленного выше struct Vertex
в это представление char[]
потребуется дополнительная копия (и медленный один за другим). Так что это неэффективно.
В качестве альтернативы, вы можете записать данные непосредственно в представление char[]
, но это крайне неудобно. Гораздо приятнее сказать verts[5].x = 3.0f
, чем обращаться к байтовому массиву, записывая число с плавающей точкой в 4 байта и т. Д. c.
Есть ли хороший, переносимый способ сделать это?