【发布时间】:2014-06-01 19:06:38
【问题描述】:
我经常使用结构来封装一段图形数据,比如颜色/像素。如果他们使用预期的数据类型,我可以将这些数组传递给 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);
【问题讨论】:
-
从 GL 的角度来看,这两件事没有区别。
colors是连续内存块的地址。两者之间唯一可能不同的地方与结构数组的对齐有关,但在这种情况下,我真的看不到导致对齐问题的uint8_tuint8_t在大多数平台上可以与任意 1 字节边界对齐,其中 4 个甚至可以提高不需要更改对齐的几率。