【问题标题】:Why glm::vec3 is not ordered like a floating array [closed]为什么 glm::vec3 不像浮动数组那样排序[关闭]
【发布时间】:2020-01-31 02:48:38
【问题描述】:

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

为了画一个简单的三角形,本网站提供的第一个例子是使用浮点数组:

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 对象时我应该记住这一点吗?

【问题讨论】:

  • 我未能从您提供的代码中复制此结果。如果您提供此行为的工作演示,我们可以仔细查看,否则,您的代码的另一部分可能存在错误。

标签: c++ opengl glm-math


【解决方案1】:

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

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

【讨论】:

  • 你是对的,我只是错过了分配我的数据,所以它变得无序
猜你喜欢
  • 2014-02-01
  • 1970-01-01
  • 2016-02-06
  • 2014-03-19
  • 1970-01-01
  • 2017-06-21
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多