Я часто использую структуру для инкапсуляции графических данных, таких как цвета / пиксели. При условии, что они используют ожидаемый тип данных, могу ли я передать их массивы в OpenGL или это нарушает строгие правила наложения имен? Например:
typedef struct Color {
uint8_t v[4];
} Color;
Color colors[200];
for (int i = 0; i < 200; i++) {
/* populate color data */
}
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors);
По сравнению с менее абстрактной версией:
uint8_t colors[200 * 4];
for (int i = 0; i < 200 * 4; i++) {
/* populate color data */
}
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors);
Вы можете заставить его работать, пока нет заполнения. Дважды проверьте, что 4 == sizeof (Color)
,
В некоторых случаях вам также может понадобиться glPixelStorei
с GL_UNPACK_ALIGNMENT
дать OpenGL знать, что элементы массива в последовательных строках плотно упакованы, без дополнительного заполнения в конце строки.
Фактические операции чтения в OpenGL и других библиотечных функциях не видны компилятору C ++, поэтому строгое совмещение имен к ним не применяется. Правило применимо к вашему коду, но так как вы передаете const void*
, компилятор должен предположить, что он может иметь псевдоним что угодно, и не выполнять переупорядочение через вызов библиотеки.