Я разрабатываю собственный игровой движок с использованием OpenGL 4.6 и ищу способы оптимизации рендеринга нескольких игровых объектов. В настоящее время я использую glMultiDrawElementsIndirect для пакетной обработки и выполнения одного вызова отрисовки для нескольких объектов одновременно. Это хорошо работает, когда все объекты используют один и тот же шейдер, но сейчас я изучаю возможность использования разных шейдеров для каждого объекта.
В моей текущей настройке я привязываю шейдер перед выполнением вызов отрисовки, например:
Код: Выделить всё
shader.use();
// Set shader uniforms and other states
glDraw...; // Perform the draw call
Теперь я думаю об установке шейдера в цикле обновления каждого игрового объекта, например:
Из класса GameObject:
Код: Выделить всё
void update() {
shader.use();
// Set shader uniforms and states specific to this object
}
И в основном файле:
Код: Выделить всё
std::vector gameObjects(100);
for (auto& object : gameObjects) {
object.update(); // Set individual shaders for each game object
}
glMultiDrawElementsIndirect(...); // Issue the draw call for all objects
Я ожидал, что использование разных шейдеров в функции update() каждого игрового объекта каким-то образом позволит мне визуализировать каждый объект с помощью собственного шейдера при вызове glMultiDrawElementsIndirect. Однако я не уверен, позволяет ли OpenGL изменять шейдеры таким образом перед косвенным вызовом отрисовки.
Мой вопрос
- Можно ли установить разные шейдеры для нескольких игровых объектов и при этом использовать glMultiDrawElementsIndirect для одного вызова отрисовки?
- Если нет, то каковы альтернативные подходы для эффективной визуализации нескольких объектов с разными шейдерами при минимизации рисовать звонки?
Будем очень признательны за любые идеи или предложения по этой теме!
Подробнее здесь:
https://stackoverflow.com/questions/790 ... ltidrawele