首页 > 解决方案 > 错误 - “初始化”:无法从“glm::vec2”转换为“glm::vec3”

问题描述

我正在按照本教程使用 C++ 制作 3D 游戏引擎。

我正在使用 GLM,但我收到了标题中的错误。
我有一个自定义结构的数组。它保存位置、颜色和纹理坐标。

“顶点”结构

struct Vertex {
glm::vec3 position;
glm::vec3 color;
glm::vec2 texcoord;
};

“顶点”数组:

Vertex vertices[] = {

//POSITION
glm::vec3(0.0f, 0.5f, 0.f),
glm::vec3(-0.5f, -0.5f, 0.f),
glm::vec3(0.5f, -0.5f, 0.f),

//COLOR
glm::vec3(1.f, 0.f, 0.f),
glm::vec3(0.0f, 1.f, 0.f),
glm::vec3(0.0f, 0.f, 1.f),

//TEXCOORDS
glm::vec2(0.f, 1.f),
glm::vec2(0.f, 0.f),
glm::vec2(1.f, 0.f)
};

当我在 Visual Studio 中单击错误时,它会将我带到顶点数组的末尾。

我已经用谷歌搜索并搜索了 Stack Overflow,但我找不到这个问题的答案。我将完整的 main.cpp 文件存储在这里,如果有帮助的话。

标签: c++glm-math

解决方案


您正在初始化一个顶点数组并尝试使用 glm::vec3 和 glm::vec2 类型对其进行初始化。类型不匹配。你需要做的是:

Vertex vertices[size];
for(size_t i = 0; i < size; i++) {
    vertices[i] = Vertex( /* initialize however you need to */ );
}

这将初始化大小数组并用对象size填充它。Vertex请注意,这将初始化堆栈上的数组,这意味着您将只能存储少量顶点。你真正应该做的是:

std::vector<Vertex> vertices(size);
for(auto& vertex : vertices) { // range-based for
    vertex = Vertex{ glm::vec3(x,y,z), glm::vec3(x,y,z), glm::vec2(u,v) };
}

有关堆栈与堆分配的更多信息:https ://www.geeksforgeeks.org/stack-vs-heap-memory-allocation/ ,范围基于:https ://www.geeksforgeeks.org/range-based-loop-c /和 std::vector: https://www.geeksforgeeks.org/vector-in-cpp-stl/


推荐阅读