Member 14131869 Ответов: 1

Как сделать рендеринг/рисование нескольких сеток (из 3d-сцены)


Я работаю над графическим движком на c++ и DirectX 11. При импорте сцен (с помощью Assimp) мне приходится визуализировать несколько сеток с отдельными шейдерами. Я делаю это следующим способом
У меня есть std::vector для хранения шейдеров и еще один для сеток. После того, как я открою файл, я добавлю все сетки к этому вектору. Затем я перебираю элементы вектора с помощью цикла for и рисую каждый из них отдельно. После того, как я нарисовал все сетки, я меняю буфер местами. Это прекрасно работает, за исключением частоты кадров/производительности, которая ужасна. У меня есть видеокарта, которая должна быть в состоянии легко обрабатывать заголовки AAA, но изо всех сил пытается визуализировать простую 3d-модель.

Что я уже пробовал:

Я не знаю, как это можно сделать более эффективно или как это должно быть сделано.

1 Ответов

Рейтинг:
1

KarstenK

Вы должны оптимизировать свой код. Например, добавление всех сеток к вектору - это не очень хорошая идея. А как насчет того, чтобы иметь массив структур с одной сеткой и шейдером? Это позволило бы сократить время цикла.

И вы должны нарисовать каждую сетку за один шаг, но запустить движок рендеринга один раз и нарисовать ВСЕ сетки.

псевдокод:

void drawAll()
{
  Renderdata *renderConfig = configureRendering();//setup env, prepare buffers

  for( SingleRender *rendering in allRenderings ) {
    vector *data = rendering.data;
    shader *shader =  rendering.shader;
     
    drawVector(renderConfig, data, shader);
  }

  finalizeRendering();//swap to screen
  cleanUpConfig(renderConfig);//freeing resources
}


Подумайте о некоторых глобальных данных предварительной настройки, которые не нужно создавать при каждом drawAll (), как векторные и шейдерные данные.

Сделайте вывод времени, чтобы найти РЕАЛЬНЫЙ" узкие места. :-O