Итак, я работаю над простым игровым движком с C++ и OpenGL 4. Сейчас я борюсь с рендерингом импортированных моделей.
Я использую FBX sdk для импорта моделей fbx, используя очень наивный подход: в основном я посещаю каждый узел fbx и добавляю данные сетки в одну большую структуру, которая позже используется для рендеринга. Однако я хочу иметь возможность указать другой шейдер фрагмента для каждого материала, используемого моделью (например, другой шейдер для автомобильных дисков и фар).
Для справки: в UE4 есть система материалов, которая позволяет пользователю определять простой шейдер с помощью редактора, похожего на чертеж.
Я хотел бы применить аналогичную концепцию к моему движку, позволяя создавать материальный объект, который определяет фрагмент кода шейдера фрагмента и набор используемых текстур.
Проблемы, с которыми я сталкиваюсь:
- Понятно, что я должен разделить вызовы отрисовки для каждой части модели, в которой используется другой материал, поскольку я не могу поменять местами программу в середине вызова отрисовки (можно ли?): на данный момент лучше иметь отдельный vao /vbo/ebo для каждой части или отдельной и отслеживать, где заканчивается часть и начинается следующая? (думаю это лучший вариант)
- Хорошей практикой является предварительная компиляция только фрагмента шейдера и подключение его к текущей программе на лету (например, glAttach + glLinkProgram + glUseProgram) или лучше предварительно связать всю программу для каждого материала, учитывая, что вершина шейдер всегда один и тот же?