【问题标题】:Passing arrays of structs to OpenGL将结构数组传递给 OpenGL
【发布时间】: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_t uint8_t在大多数平台上可以与任意 1 字节边界对齐,其中 4 个甚至可以提高不需要更改对齐的几率。

标签: c++ c opengl


【解决方案1】:

只要没有填充,您就可以让它工作。仔细检查4 == sizeof (Color)

在某些情况下,您可能还需要将 glPixelStoreiGL_UNPACK_ALIGNMENT 一起使用,以让 OpenGL 知道连续行中的数组元素是紧密排列的,而行尾没有额外的填充。

OpenGL 和其他库函数中的实际读取操作对 C++ 编译器不可见,因此严格的别名不适用于它们。该规则确实适用于您的代码,但由于您传递的是 const void*,因此编译器必须假定它可以为任何内容设置别名,并且不会在库调用中执行重新排序。

【讨论】:

  • 这个。此外,大多数编译器为结构打包提供了编译器特定的属性,即元素被紧密打包到结构中,中间没有间隙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多