В общем, если вы не используете необычные приемы , вам нужно сгладить положения и координаты текстуры в параллельные массивы.
Обойти грани для каждого лица, создать новую пару position-texcoord (или position-normal-texcoord Triple)
псевдокод
loadedPositions = [...];
loadedTexcoords = [...];
renderablePositions = [];
renderableTexcoords = [];
for each face
renderablePositions.push(loadedPositions[face.positionIndex])
renderableTexcoords.push(loadedTexcoords[face.texcoordIndex])
Теперь вы можете визуализировать renderablePositions / rendeableTexoords с помощью drawArrays
Это зависит от вас, если вы хотите чтобы попытаться переиндексировать новый renderablePositon / renderableTexcoords.
псевдокод
loadedPositions = [...];
loadedTexcoords = [...];
renderablePositions = [];
renderableTexcoords = [];
renderableIndices = [];
idToIndexMap = {};
for each face
id = `${face.positionIndex},${face.texcoordIndex}`;
if (idToIndexMap[id] === undefined) {
const index = renderablePositions.length // or length / 3
idToIndexMap[id] = index;
renderablePositions.push(loadedPositions[face.positionIndex])
renderableTexcoords.push(loadedTexcoords[face.texcoordIndex])
}
renderableIndices.push(idToIndexMap[id])
теперь вы можете рендерить с помощью drawElements
Несколько вещей, которые может сделать лицо иметь более 3 вершин, поэтому вам придется генерировать треугольники, если вы хотите обработать этот случай.
У грани могут быть отрицательные индексы, указывающие индекс относительно числа позиций / нормалей / текстовых координат, встречающихся в файле до сих пор.
лучшая ссылка .obj, которую я нашел, это эта