繁体   English   中英

将结构数组传递给OpenGL

[英]Passing arrays of structs to 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);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM