12

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

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

我不太确定,因为 struct padding(成员对齐)在我看来可能会造成一些麻烦,尽管我测试过的所有编译器都会返回预期的大小。

我正在为 C++11 编译器开发(也许这会有所不同)。

4

2 回答 2

9

定义“安全”。

C++ 为实现提供了广泛的空间来填充它们认为合适的结构。因此,就 ISO C++ 而言,这是否“有效”是依赖于实现的行为。

它通常适用于桌面平台的许多编译器。我不能说 ARM CPU,但一般来说,glm::vec3大小为 3 个浮点数。但是,如果你想确保,你总是可以执行一个简单的static_assert

static_assert(sizeof(glm::vec3) == sizeof(GLfloat) * 3, "Platform doesn't support this directly.");
于 2012-11-26T20:01:32.650 回答
0

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

于 2012-11-26T19:45:45.887 回答