我可以安全地使用 glm::* 类型(例如 vec4、mat4)来填充顶点缓冲区对象吗?
std::vector<glm::vec3> vertices;
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * vertices.size(), &vertices[0], GL_STATIC_DRAW);
我不太确定这一点,因为在我看来,结构填充(成员对齐)可能会造成一些麻烦,尽管我测试过的所有编译器都返回预期的大小。
我正在为 C++11 编译器开发(也许这会有所作为)。
定义"safe"。
C++ 为实现提供了他们认为合适的填充结构的广泛自由度。因此,就 ISO C++而言,这是否"有效"是依赖于实现的行为。
它通常适用于桌面平台的许多编译器。我不能代表 ARM CPU,但一般来说,glm::vec3
的大小将是 3 个浮点数。但是,如果要确保,则始终可以执行简单的static_assert
:
static_assert(sizeof(glm::vec3) == sizeof(GLfloat) * 3, "Platform doesn't support this directly.");
是的,glm 是专门为此而设计和构建的。