Я постараюсь ответить на все ваши вопросы как можно лучше.
1) Нужно ли, чтобы координаты УФ были в диапазоне от 0 до 1, без
учет ширины и длины местности или нет?
Координаты UV обычно находятся в интервале от 0 до 1, но если вы передадите UV, а не от 0 до 1, способ обработки UV будет зависеть от того, как вы настроили OpenGL для обработки этого случая.
Вы можете указать сэмплеру текстуры обрабатывать координаты как перенос с помощью следующего кода:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
В качестве альтернативы вы можете зафиксировать значения УФ с помощью следующего кода:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Подробнее об образцах текстур здесь:
https://www.khronos.org/opengl/wiki/Sampler_Object
Должна ли матрица координат UV иметь ту же длину, что и
массив вершин?
Вообще-то да. При текстурировании некоторой геометрии вы обычно хотите по крайней мере один UV для каждой вершины, таким образом, вы должны иметь то же количество UVS, что и вершины.
НО у вас может быть больше, если у вас есть более одной текстуры, примененной к геометрии, или у вас может быть меньше, если вы текстурируете свою геометрию другими способами, например, с помощью написанного вами фрагментного шейдера, который не требует UVS.
Вы также можете иметь меньше, если ваши UVS проиндексированы, то есть когда вершины, которые совместно используют один и тот же UV, ссылаются на один и тот же UV в массиве через индекс. Но если вы хотите, чтобы все было просто, просто перейдите к 1 к 1 и не беспокойтесь о дубликатах.
Есть ли какой-нибудь простой алгоритм или способ, которым я мог бы указать UVs
местность?
Один из простых способов сделать это - просто текстурировать каждый треугольник как часть четырехугольника. Ваш ландшафт должен быть просто сеткой четырехугольников, что означает, что вы можете просто перебирать список вершин, назначая каждый квад в вашей сетке с текстурными координатами, подобными этим:
Еще лучше, если сетка вашей местности имеет размеры 1 по x и z, вы можете просто подключить мировые пространственные координаты вашей сетки к x и z и установить сэмплер текстуры для переноса, предполагая, что ваша сетка не повернута. , Он все равно будет работать, если ваша сетка вращается, но текстура не будет вращаться вместе с ней.