Передача массивов структур в OpenGL

Я часто использую структуру для инкапсуляции графических данных, таких как цвета / пиксели. При условии, что они используют ожидаемый тип данных, могу ли я передать их массивы в 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);

1

Решение

Вы можете заставить его работать, пока нет заполнения. Дважды проверьте, что 4 == sizeof (Color),

В некоторых случаях вам также может понадобиться glPixelStorei с GL_UNPACK_ALIGNMENT дать OpenGL знать, что элементы массива в последовательных строках плотно упакованы, без дополнительного заполнения в конце строки.

Фактические операции чтения в OpenGL и других библиотечных функциях не видны компилятору C ++, поэтому строгое совмещение имен к ним не применяется. Правило применимо к вашему коду, но так как вы передаете const void*, компилятор должен предположить, что он может иметь псевдоним что угодно, и не выполнять переупорядочение через вызов библиотеки.

3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector