Найти в Дзене

Оптимизация рендеринга в Vulkan: Подробное объяснение функций

В данной статье я расскажу о процессе оптимизации позиций вершин и нормалей, используя физически обоснованное затенение в Vulkan. На написание этой статьи мне подтолкнул вопрос к предыдущей статье. Здесь я рассмотрю ключевые функции программы, которая реализует этот процесс, и подробно разберу их работу.
Программа представлена классом BasicRenderer (находиться в статье "Оптимизация рендеринга в Vulkan: Реактивная упаковка шейдеров и растеризация"), который выполняет основные операции по загрузке, обработке и оптимизации 3D-сцены. Весь процесс можно разбить на несколько этапов, каждый из которых реализован отдельной функцией. Давайте разберем каждую из них. Функция loadScene отвечает за загрузку 3D-сцены из GLTF-файла и целевого изображения, которые затем анализируются для создания соответствующих переменных вычислительного графа. Функция buildGraph создает вычислительный граф рендеринга с учетом заданных параметров и настроек для оптимизации. Функция setRequiresGrad устанавливает флаг
Оглавление

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

Пример программы

Программа представлена классом BasicRenderer (находиться в статье "Оптимизация рендеринга в Vulkan: Реактивная упаковка шейдеров и растеризация"), который выполняет основные операции по загрузке, обработке и оптимизации 3D-сцены. Весь процесс можно разбить на несколько этапов, каждый из которых реализован отдельной функцией. Давайте разберем каждую из них.

1) loadScene

Описание

Функция loadScene отвечает за загрузку 3D-сцены из GLTF-файла и целевого изображения, которые затем анализируются для создания соответствующих переменных вычислительного графа.

Аргументы

  • gltf_filename: Имя GLTF-файла, содержащего исходную сцену.
  • target_img_filename: Имя файла изображения, которое используется в качестве эталона для оптимизации.

Внутренние вычисления

  • Использует LoadGltfAsCpuImages для загрузки данных сцены в формате CpuImage.
  • Создает переменные верхнего уровня для каждой части сцены (положение вершин, текстуры и т.д.) на основе загруженных данных.

Возвращаемые значения

  • Функция изменяет внутреннее состояние объекта BasicRenderer и не возвращает значений.

2) buildGraph

Описание

Функция buildGraph создает вычислительный граф рендеринга с учетом заданных параметров и настроек для оптимизации.

Аргументы

  • K: Количество итераций "пилинга" (peeling).
  • r: Радиус для некоторых вычислений.
  • sigma: Параметр смешивания.
  • delta: Ширина края силуэта.
  • lr: Скорость обучения для оптимизатора.

Внутренние вычисления

  • Вызывает BuildBasicRenderGraph для создания графа рендеринга.
  • Рассчитывает потери как среднее абсолютное отклонение между целевым и рендеренным изображениями.
  • Настраивает оптимизатор, задавая функцию обновления переменных с использованием градиентного спуска.

Возвращаемые значения

  • Функция изменяет внутреннее состояние объекта BasicRenderer и не возвращает значений.

3) setRequiresGrad

Описание

Функция setRequiresGrad устанавливает флаг, указывающий, что для данной переменной требуется вычисление градиента.

Аргументы

  • name: Имя переменной, для которой требуется вычисление градиента.

Внутренние вычисления

  • Устанавливает флаг requires_grad для переменной в m_var_map.

Возвращаемые значения

  • Функция изменяет состояние переменной в m_var_map и не возвращает значений.

4) execStep

Описание

execStep выполняет одну итерацию оптимизации, передавая данные на GPU и получая результаты.

Аргументы

  • Нет.

Внутренние вычисления

  • Проверяет, были ли уже отправлены изображения на GPU; если нет, отправляет их.
  • Выполняет одну итерацию оптимизации, используя настроенный оптимизатор.

Возвращаемые значения

  • Функция изменяет внутреннее состояние объекта BasicRenderer и не возвращает значений.

5) saveScene

Описание

Функция saveScene сохраняет оптимизированные данные сцены в GLTF-файл.

Аргументы

  • gltf_filename: Имя файла, в который сохраняется оптимизированная сцена.

Внутренние вычисления

  • Получает все обновленные данные с GPU.
  • Использует SaveGltfFromCpuImages для сохранения данных в формате GLTF.

Возвращаемые значения

  • Функция сохраняет данные в файл и не возвращает значений.

Общие замечания

  • Каждая функция взаимодействует с внутренними структурами данных m_img_map и m_var_map, которые содержат изображения и переменные соответственно.
  • Оптимизация выполняется методом градиентного спуска, для чего рассчитываются потери и обновляются переменные.