Каждое значение в массиве индекса указывает на в то же время для позиции, нормали и координаты текстуры.
Они организованы только в группы по 3, потому что они просто описывают вершины треугольника, поэтому 3 вершины = 1 треугольник, конечно.
const GLushort tigerBottomIndices[] = {
0,1,2, // #1 Triangle
3,0,4, // #2 Triangle
1,5,6, // #3 Triangle
…
Итак, давайте выберем первое значение этих индексов, это 0 .
Это означает:
Выберите номер позиции вершины 0
Также выберите нормальное число вершины 0
И выбрать координаты текстуры с номером 0
const Vertex3D tigerBottomPositions[] = {
{0.176567, 0.143711, 0.264963}, // This is the position number 0
{0.176567, 0.137939, 0.177312},
{0.198811, 0.135518, 0.179324},
…
};
const Vertex3D tigerBottomNormals[] = {
{-0.425880, -0.327633, 0.350967}, // This is the normal number 0
{-0.480159, -0.592888, 0.042138},
{-0.113803, -0.991356, 0.065283},
…
};
const GLfloat tigerBottomTextureCoords[] = {
0.867291, 0.359728, // These are the tex-coords number 0
0.779855, 0.359494,
0.781798, 0.337223,
…
};
Итак, эта информация отправляется в вершинный шейдер:
VertexPosition: 0,176567, 0,143711, 0,264963
VertexNormal: -0,425880, -0,327633, 0,350967
VertexTextureCoordinates: 0,867291, 0,359728
...
Если вы не используете индексы, opengl будет отправлять эти данные вершин линейно, поэтому после отправки данных вершин номер 0 он будет отправлять данные в позиции 1 массивов, а затем в 2, 3, 4 и т.д ...
Это хорошо, но иногда ваши треугольники заканчиваются одной или двумя одинаковыми вершинами. Учтите это:
Вы можете видеть 2 треугольника, образующих квадрат, и у них есть 2 общие вершины, 0 и 2. Таким образом, вместо 6 вершин, которые равны 3 для каждого треугольника, у нас есть только 4, и 2 трэнгла используют одни и те же данные для 2 их вершины. Это хорошо для производительности, особенно когда у вас большие модели с сотнями треугольников.
Чтобы нарисовать первый треугольник, нам нужны вершины с номерами 0, 1 и 2, а для второго треугольника нам понадобятся вершины с номерами 0, 2 и 3.
Видите, без массива индекса opengl будет пытаться использовать вершины 0, 1 и 2 (нормально для первого треугольника), но для второго треугольника opengl будет искать вершины 3, 4 и 5. Что неверно.
И именно поэтому мы создаем индексный массив, чтобы opengl мог отправлять вершины для вершинного шейдера. В нашем случае наш индексный массив будет выглядеть так:
const GLushort tigerBottomIndices[] = {
0,1,2,
0,2,3,
}