如何保证 std::vector<Vec3> 具有与 float[] 等效的内存布局?

mpe*_*pen 0 c++

我要这个:

GLfloat vertices2[]  {
        -0.5f, -0.5f, 0.0f, // left
        0.5f, -0.5f, 0.0f, // right
        0.0f,  0.5f, 0.0f  // top
};
Run Code Online (Sandbox Code Playgroud)

和这个:

std::vector<Vec3> vertices3 {
        {{ -0.5f, -0.5f, 0.0f}, // left
         { 0.5f, -0.5f, 0.0f },// right
         { 0.0f, 0.5f, 0.0f}}  // top
};
Run Code Online (Sandbox Code Playgroud)

具有等效的内存布局,以便我可以将其传递给 OpenGL。

IIUCstd::vector保证连续列出其数据,但我对我的Vec3课程不太确定。

我定义Vec3为:

class Vec3 {
private:
    GLfloat _data[3];

public:
    Vec3(GLfloat x, GLfloat y, GLfloat z) : _data{x,y,z} {};

    GLfloat &x = _data[0];
    GLfloat &y = _data[1];
    GLfloat &z = _data[2];

    inline GLfloat &operator[](size_t i) {
        return _data[i];
    }
};
Run Code Online (Sandbox Code Playgroud)

但我认为有些事情是错误的,因为vertices3.data()似乎不等于vertices2


哦..我想我的参考资料不是很免费,是吗?GLfloat &x = _data[0]是添加一个指针吗?有没有另一种方法可以在不受到惩罚的情况下编写此代码,并且除了 之外仍然保留.x,语法?.y[]

Bot*_*tje 5

这些GLFloat&成员也占用空间。将它们替换为成员函数,例如:

GLfloat& x() { return _data[0]; }
const GLfloat x() const { return _data[0]; }
Run Code Online (Sandbox Code Playgroud)

或者直接使用glm::vec3常用的 GLM 库。