我正在关注OpenGL教程,其中,将网格数据传递到视频卡的工作基本如下:
#include <GL/glew.h>
#include <glm/glm.hpp>
struct Vertex {
...
private:
glm::vec3 pos;
glm::vec2 texCoord;
glm::vec3 normal;
};
Mesh::Mesh(Vertex * vertices, unsigned int numVertices) {
...
glBufferData(GL_ARRAY_BUFFER, numVertices * sizeof(vertices[0]), vertices, GL_STATIC_DRAW);
...
}
然而,我觉得这可能会导致问题,因为假设顶点将完美布局。或者是否可以保证顶点字段的放置没有填充并按顺序放置?另外,我不知道glm :: vec *类型的布局或大小是什么。
我怀疑这可能会导致问题吗?
应该做些什么呢?
什么会影响结构的布局?
答案 0 :(得分:2)
如果指定了正确的属性指针,例如:
,这种方法没有任何问题glVertexAttribPointer( ..., 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), offsetof(Vertex, pos));
glVertexAttribPointer( ..., 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), offsetof(Vertex, texCoord));
glVertexAttribPointer( ..., 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), offsetof(Vertex, normal));
sizeof
和offsetof
都会考虑可能发生的任何填充。
如果您想要更多地控制实际布局,您当然也可以使用#pragma pack
,这不是任何C / C ++标准的一部分,但是所有主要编译器都能理解。实际上,在存在OpenGL实现的平台上没有真实编译器会为原始结构布局添加任何填充,因此这可能是一个没有实际意义的点。
另外,我不知道
glm::vec*
类型的布局或大小是什么。
GLM向量和矩阵是相应基类型的紧密数组,特别是float[N]
glm::vecN
。