C++:OpenGL,glm和结构体填充

12

我可以安全地使用glm::*类型(例如vec4,mat4)填充顶点缓冲区吗?

std::vector<glm::vec3> vertices;    
glBufferData(GL_ARRAY_BUFFER,  sizeof(glm::vec3) * vertices.size(), &vertices[0], GL_STATIC_DRAW);

在我看来,结构填充(成员对齐)可能会引起一些问题,尽管我测试过的所有编译器都返回了预期的大小,但我对此并不十分确定。

我正在开发C++11编译器(也许这会产生差异)。

2个回答

10

什么是“安全”?

C++允许实现广泛地填充结构,因此就ISO C++而言,这种“工作方式”取决于实现的行为。

通常情况下,它可以在多个桌面平台上的编译器中工作。我无法对ARM CPU进行评论,但一般来说,glm::vec3的大小为3个浮点数。但是,如果您想确保,您总可以执行简单的static_assert

static_assert(sizeof(glm::vec3) == sizeof(GLfloat) * 3, "Platform doesn't support this directly.");

0

是的,glm是专门为此目的设计和构建的。


5
据消息来源,他们只是使用了4个浮点数的结构体,默认情况下这种方法不安全,会存在结构体填充。这就是我提出这个问题的原因。 - Kr0e
1
为什么不安全呢?该库的整个目标是完全与OpenGL和GLSL一致,并且自2005年以来一直在实现这一目标。 - anthonyvd
1
如果glm文档规定它是安全的,那么他们需要实现和测试它,以确保在他们支持的实现中是安全的。他们可以依赖于实现定义的行为来实现它,没有理由不这样做。 - bames53
@bames53:在这种情况下不可行。对齐可能会因编译器调用而异。您不能仅在某个平台上测试一次,然后在此完全未指定的行为中为该平台打上一个大绿色勾号。 - Lightness Races in Orbit
2
只要他们没有实际指示编译器不要打包结构体,无论他们测试了多少次,这都是不安全的。我不在乎它“官方支持”什么。 - Lightness Races in Orbit
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接