假设结构数组的内存布局传递给OpenGL可能导致错误

时间:2018-05-27 22:34:59

标签: c++ opengl memory-layout

我正在关注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 *类型的布局或大小是什么。

我怀疑这可能会导致问题吗?

应该做些什么呢?

什么会影响结构的布局?

1 个答案:

答案 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));

sizeofoffsetof都会考虑可能发生的任何填充。

如果您想要更多地控制实际布局,您当然也可以使用#pragma pack,这不是任何C / C ++标准的一部分,但是所有主要编译器都能理解。实际上,在存在OpenGL实现的平台上没有真实编译器会为原始结构布局添加任何填充,因此这可能是一个没有实际意义的点。

  

另外,我不知道glm::vec*类型的布局或大小是什么。

GLM向量和矩阵是相应基类型的紧密数组,特别是float[N] glm::vecN