Ошибка - «инициализация»: невозможно преобразовать из «glm :: vec2» в «glm :: vec3» - PullRequest
0 голосов
/ 30 сентября 2019

Я создаю движок для 3D-игр на C ++, следуя этому уроку .

Я использую 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, это приводит меня к концу моего массива Vertice.

Я гуглил и искал переполнение стека, и не могу найти ответ на эту проблему. У меня есть полный файл main.cpp здесь , если это поможет.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Вы объявляете массив, поэтому каждый элемент массива должен быть заключен в инициализатор.

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)
}
};


0 голосов
/ 30 сентября 2019

Вы инициализируете массив 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/, в зависимости от: https://www.geeksforgeeks.org/range-based-loop-c/ и std :: vector: https://www.geeksforgeeks.org/vector-in-cpp-stl/

...