为什么 glm::vec3 不像浮动数组那样排序

Why glm::vec3 is not ordered like a floating array

我正在从这个网站学习 openGL https://learnopengl.com

画一个简单的三角形,本站提供的第一个例子是使用float数组:

float triangle[] = {
        -0.5f, -0.5f, 0.0f, // left  
         0.5f, -0.5f, 0.0f, // right 
         0.0f,  0.5f, 0.0f  // top   
    }; 

当然很好用。但是除了这个例子之外,我还尝试使用一个带有 glm::vec3 的基本结构,如下所示:

struct Position {
    glm::vec3 pos;
};

然后为了存储与浮点数组相同的数据,我只是做了一个简单的位置数组,如下所示:

Position leTriangle[3];
leTriangle[0].pos = glm::vec3(-0.5f, -0.5f, 0.0f);
leTriangle[1].pos = glm::vec3(0.5f, -0.5f, 0.0f);
leTriangle[2].pos = glm::vec3(0.0f,  0.5f, 0.0f);

(当然这只是为了测试是否可行)

然后在使用 glBufferData 和 glVertexAttribPointer 将我的位置数组发送到 GPU 后,三角形不再出现。所以,只是为了看看我发送的数组是否与示例浮动数组相似,我这样做了:

float* test = (float*)&leTriangle;
for(int e = 0; e < ((12/4) * 3); e++,test++){
    std::cout << *test << std::endl;
}

而不是打印相同的浮动数组,它打印这个:

0.0f,-0.5f,-0.5f,// left
0.0f,-0.5f,0.5f, // right
0.0f,0.5f,0.0f  // top

X 和 Z 值已反转。所以我猜GLM数据的顺序不是我想的那样

谁能解释一下为什么 GLM 中的数据是这样排序的?我应该尊重这个顺序还是应该尝试推翻它?也许这并不重要,这是我在放置 3D 对象时应该考虑的事情吗?

glm::vec3 结构中的数据排序正确。您可以通过检查 test 变量指向的内存来轻松验证这一点:

你得到了奇怪的结果,因为你的测试有问题,你显然在向后阅读 glm::vec3 个字段。您问题中的代码没有表现出这种行为。也许您应该检查一下您是如何分配数据的。