Как настроить / рассчитать текстурбуфдер в GltexcoordPointer при импорте из obj-файла
Вопрос
Я разбираю файл OBJ в Android, и моя цель - регларировать и отображать объект. Все работает нормально, за исключением правильного сопоставления текстуры (импортирование ресурса / изображения в OpenGL и т. Д. Точно).
Я не знаю, как заполнить данные, связанные с текстурой, связанные с файлом OBJ в текстурбуфтер-объект.
В OBJ-файле у меня VT-Lines:
vt 0.495011 0.389417
vt 0.500686 0.561346
и линию лица:
f 127/73/62 98/72/62 125/75/62
Моя розыгрыш выглядит как (только соответствующие части):
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glNormalPointer(GL10.GL_FLOAT, 0, normalsBuffer);
gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, t.getvtBuffer());
gl.glDrawElements(GL10.GL_TRIANGLES, t.getFacesCount(), GL10.GL_UNSIGNED_SHORT, t.getFaceBuffer());
Выход отсчетов obj-файла:
Vertex-count: 1023
Vns-count: 1752
Vts-count: 524
/////////////////////////
Part 0
Material name:default
Number of faces:2037
Number of vnPointers:2037
Number of vtPointers:2037
Любой совет приветствуется.
Решение
Извините, не уверен, в какой степени это покровительствует, но сверху:
f 127/73/62 98/72/62 125/75/62
Означает треугольник между вершиной с 127-й позицией, приведенной в файле, 73-й позиции текстуры в файле и 62-й нормальном и двух других вершинах, указанных аналогичным образом.
В OpenGL вы указываете только один индекс на вершину (так как все это проходит через преобразование как единое целое), поэтому вам нужно выяснить все различные комбинации позиции, координату текстуры и нормально и устраивать буферы, которые вы передаете glVertexPointer
, glNormalPointer
и glTexCoordPointer
соответственно. Например, приведенное выше лицо может быть указано через GL_TRIANGLES как между вершинами 0, 1 и 2, где вы бы скопировали 127-е место до первой в своем внутреннем буфере вершины, вы скопировали координату 73-й текстуры для первого В вашем внутреннем буфере координат текстуры, и вы скопировали 62-й нормальный в первый в вашем внутреннем нормальном списке.
Вполне возможно, вы хотите, чтобы Hashmap принимал комбинированную клавишу вершины / текстуры координаты / Normal и отображение в положение в ваших внутренних массивах. Когда вы сталкиваетесь с каждым лицом в Incoming Obj, вы можете проверить, вы уже получили эту комбинацию, выделенную на место в ваших внутренних буферах и дайте ему следующую доступную, если нет.
VT - это текстура координат, так, например, координата текстуры:
vt 0.495011 0.389417
Означает, что в рамках текстурного пространства X = 0,495011, y = 0,389417. Из памяти форма формата файла OBJ и OpenGL имеют оси Y в противоположных направлениях. Таким образом, в условиях OpenGL вы хотите S = 0,495011, T = 1 - 0,389417 = 0,610583.
Если ваш объект использует соответствующую сложную текстуру ATLAS или Shinkning, я представляю, это будет далеко не очевидно, что координаты Y перевернуты; Если у вас просто есть что-то вроде куба с одной и той же текстурой, повторяется полностью на каждом лице, возможно, вы, вероятно, просто увидите его как перевернуты по вертикали.
Это охватывает источник путаницы?