OpenGL — загрузка объекта с несколькими текстурами

Я пытаюсь нарисовать модель квадрокоптера, используя OpenGL. У объекта quadcopter есть файл .obj, файл .mtl и три файла .tga для текстурирования (один для роторов, один для корпуса, один для оружия).

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

3

Решение

Объект будет выглядеть примерно так …

#all vertex data (for all materials)
v 0.020542 1.017087 -0.056279
v -0.000138 0.971408 -1.947060
v 0.017678 -0.000000 -0.017678
...
usemtl material_rotors
#all faces with rotor material
f 125/185/28 142/184/3 127/183/3
f 126/186/29 138/187/29 143/188/28
usemtl material_body
#all faces with body material
f 150/190/32 132/191/32 138/192/29
f 150/190/32 138/192/29 126/193/29

Вы можете хранить все в одном и том же объекте сетки, не разделяя его как таковые, но вместо этого используйте отдельные вызовы отрисовки. Например:

foreach (material in model.materials)
material.bind() //binds textures, sets colours, shader uniforms etc
glDrawElements(GL_TRIANGLES, material.indexCount, GL_UNSIGNED_INT, model.bufferStart + material.startIndex)

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

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

2

Другие решения

Самый простой способ является разделить объект на три отдельных объекта, в противном случае вам понадобится какой-то метод определения текстуры текстуры. Это потребует дополнительной информации для каждой вершины в модели.

Я не знаком с форматом obj, но в большинстве форматов я работал с отдельными объектами с разными материалами в отдельных сетках, где каждая сетка ссылается на один материал.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector