错误 - 'initializing':无法从 'glm::vec2' 转换为 'glm::vec3'
Error - 'initializing': cannot convert from 'glm::vec2' to 'glm::vec3'
我正在使用 C++ 制作 3D 游戏引擎,然后 tutorial。
我正在使用 GLM,但出现标题中的错误。
我有一个自定义结构数组。它保存位置、颜色和纹理坐标。
"Vertex" 结构
struct Vertex {
glm::vec3 position;
glm::vec3 color;
glm::vec2 texcoord;
};
"Vertices"数组:
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 文件存储 here,如果有帮助的话。
您正在初始化一个 Vertex 数组并尝试使用类型 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/, ranged based for: https://www.geeksforgeeks.org/range-based-loop-c/ and std::vector: https://www.geeksforgeeks.org/vector-in-cpp-stl/
您声明了数组,因此每个数组元素都必须用初始化器括起来。
Vertex vertices[] = {
// First element
{
glm::vec3(0.0f, 0.5f, 0.f), //POSITION
glm::vec3(1.f, 0.f, 0.f), //COLOR
glm::vec2(0.f, 1.f), // TEXTCOORD
},
// Second element
{
glm::vec3(-0.5f, -0.5f, 0.f),
glm::vec3(0.f, 1.f, 0.f),
glm::vec2(0.f, 0.f),
},
// Third element
{
glm::vec3(0.5f, -0.5f, 0.f),
glm::vec3(0.f, 0.f, 1.f),
glm::vec2(1.f, 0.f)
}
};
我正在使用 C++ 制作 3D 游戏引擎,然后 tutorial。
我正在使用 GLM,但出现标题中的错误。
我有一个自定义结构数组。它保存位置、颜色和纹理坐标。
"Vertex" 结构
struct Vertex {
glm::vec3 position;
glm::vec3 color;
glm::vec2 texcoord;
};
"Vertices"数组:
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 文件存储 here,如果有帮助的话。
您正在初始化一个 Vertex 数组并尝试使用类型 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/, ranged based for: https://www.geeksforgeeks.org/range-based-loop-c/ and std::vector: https://www.geeksforgeeks.org/vector-in-cpp-stl/
您声明了数组,因此每个数组元素都必须用初始化器括起来。
Vertex vertices[] = {
// First element
{
glm::vec3(0.0f, 0.5f, 0.f), //POSITION
glm::vec3(1.f, 0.f, 0.f), //COLOR
glm::vec2(0.f, 1.f), // TEXTCOORD
},
// Second element
{
glm::vec3(-0.5f, -0.5f, 0.f),
glm::vec3(0.f, 1.f, 0.f),
glm::vec2(0.f, 0.f),
},
// Third element
{
glm::vec3(0.5f, -0.5f, 0.f),
glm::vec3(0.f, 0.f, 1.f),
glm::vec2(1.f, 0.f)
}
};