Я полагаю, что это своего рода крест между чистым вопросом на C++ и вопросом OpenGL. У меня есть единый буфер, и я выделяю в нем пробелы в байтах sizeof (ShaderData). Я использую макет std140 на стороне графического процессора в шейдере.Выравнивание структур с std140, сторона процессора
Согласно правилам std140, мне нужно добавить отступы в разных местах моей структуры, чтобы убедиться, что такие вещи, как векторы, правильно выровнены. Структура Ниже приводится пример (для моего света):
struct ShaderData {
float Light_Intensity;
float _pad1[3]; // align following vec3 on 4N boundary
Math::Vec3f Light_Position;
float _pad2; // align following vec4 on 4N boundary
Math::Colour4f Light_Ambient;
Math::Colour4f Light_Diffuse;
Math::Colour4f Light_Specular;
float Light_AttenuationMin;
float Light_AttenuationMax;
} MyShaderData;
Является ли это то, как люди обычно делают вещи в C++, или есть специальные ключевые слова или псевдокомментарии для выравнивания отдельных элементов боковой структуры процессора, которые немного опрятнее?
ОК, правильно, я видел это минуту назад. Но в общем случае (а не в моем конкретном случае), что лучше всего подходит для заполнения? Всегда ли * оптимизированный порядок, который не требует этого? Кажется маловероятным. – Robinson
AFAIK нет стандартизованного способа определения дополнения в общем виде, который не так, как вы делаете (фиктивные элементы структуры). Существуют некоторые директивы '# pragma', связанные с выравниванием, но я не уверен, насколько они стандартизированы. http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html – Jack
Я думаю, вы должны пойти что-то вроде '#pragma pack (push, 16)', чтобы установить выравнивание, а затем '#pragma pack (pop) 'восстановить его после. – Jack