Телефон: 8-800-350-22-65
WhatsApp: 8-800-350-22-65
Telegram: sibac
Прием заявок круглосуточно
График работы офиса: с 9.00 до 18.00 Нск (5.00 - 14.00 Мск)

Статья опубликована в рамках: LXXII Международной научно-практической конференции «Научное сообщество студентов XXI столетия. ТЕХНИЧЕСКИЕ НАУКИ» (Россия, г. Новосибирск, 10 декабря 2018 г.)

Наука: Информационные технологии

Скачать книгу(-и): Сборник статей конференции

Библиографическое описание:
Сыроежко А.А. ПРОЕКТИРОВАНИЕ ГРАФИЧЕСКОЙ ПОДСИСТЕМЫ ДЛЯ РАБОТЫ С НЕОГРАНИЧЕННЫМ КОЛИЧЕСТВОМ ИСТОЧНИКОВ ОСВЕЩЕНИЯ // Научное сообщество студентов XXI столетия. ТЕХНИЧЕСКИЕ НАУКИ: сб. ст. по мат. LXXII междунар. студ. науч.-практ. конф. № 12(71). URL: https://sibac.info/archive/technic/12(71).pdf (дата обращения: 23.12.2024)
Проголосовать за статью
Конференция завершена
Эта статья набрала 6 голосов
Дипломы участников
У данной статьи нет
дипломов

ПРОЕКТИРОВАНИЕ ГРАФИЧЕСКОЙ ПОДСИСТЕМЫ ДЛЯ РАБОТЫ С НЕОГРАНИЧЕННЫМ КОЛИЧЕСТВОМ ИСТОЧНИКОВ ОСВЕЩЕНИЯ

Сыроежко Александр Александрович

студент 3-го курса, кафедра аппаратного, программного и математического обеспечения вычислительных систем РТУ МИРЭА,

РФ, г. Москва

Последние 3 десятилетия были прорывными для рендеринга реального времени (Real-Time Rendering). Причинами такого бурного развития стали:

  • увлечение доступности персональных компьютеров
  • значительный рост производительности CPU (central processing unit) и GPU (graphics processing unit)
  • большой спрос на видеоигры и САПР
  • тренды: AR (augmented reality) и VR (virtual reality).

На данный момент основной задачей современной 3D-графики реального времени является получение численного решения интегрального уравнения рендеринга (1) с минимальной затратой вычислительных ресурсов.

Где:

 – длина световой волны

t – время

- количество излучения заданной длины волны исходящего вдоль направления   в момент t, из заданной точки x

- количество люминесцентного излучения заданной длины волны исходящего вдоль направления   в момент t, из заданной точки x

- интеграл по полусфере входящих направлений

- двунаправленная функция распределения отражения, количество излучения отражённого от  к  в точке  , в момент , на длине волны

- длина волны  по входящему направление к точке  из направления  в момент

 –   поглощение входящего излучения в соответствии с законом Ламберта.

 

Рисунок 1. Уравнение рендеринга

 

Таким образом, программирование современной 3D-графики сводится в основном к расчёту освещённости. Методики расчёта освещения можно условно поделить по времени их применения на объекты:

  • Прямое освещение (forward rendering)
  • Отложенное освещение (deferred shading)
  • Гибридный подход

Прямое освещение – расчёт освещения осуществляется в момент отрисовки объекта. Данный подход является самым быстрым, т.к. не требуются дополнительные обращения к GPU. Однако, данный подход не позволяет реализовать глобальные (глобальное освещение, отражения, преломления и т.д.) эффекты ввиду того, что при прямом рендеринге доступна информация только о рисуемом в данный момент объекте.

Отложенное освещение – расчёт освещения осуществляется после рендеринга сцены в G-буфер (рисунок 2), который хранит всю необходимую информацию для расчёта освещения, и является результатом постобработки кадра. Основным преимуществом данного подхода является то, что сложность расчётов не зависит от сложности рисуемой геометрии. Сложность определяется разрешением G-буфера и используемой моделью освещения.

 

Картинки по запросу gbuffer

Рисунок 2. G-буфер

 

Гибридный подход – заключается в распределении расчётов между прямым и отложенным рендерингом.

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

  • Выделение памяти с запасом
  • Перекомпиляция шейдеров
  • Использование структур данных с произвольным доступом

Выделение памяти с запасом – заключается в предварительном выделении памяти под максимальное число источников освещения в шейдере. Данные о освещении передаются посредством константного буфера. Данный метод не отличается гибкостью и экономией ресурсов.

Перекомпиляция шейдеров – заключается в динамической перекомпиляции шейдера с указанием необходимого размера массива данных с информацией о освещении. Как правило, реализуется с помощью использования макроопределений. В начале шейдера объявляются макросы типа: #define N x. Где x -требуемый размер данных, N – используется для указания размера массива. Таким образом, изменяя x в макросе и выполняя повторную компиляцию   шейдера происходит изменение размера входных данных. Данный способ достаточно гибок, но при постоянной компиляции значительно теряется производительность разрабатываемого приложения.

Использование структур с произвольным доступом – заключается в использовании специальных структур, которые не имеют ограничения на размер хранимых данных и на чтение/запись. У данного подхода только один недостаток – он требует поддержки шейдерных моделей высокой версии (от 4.0 и выше), что несколько сокращает множество поддерживаемых компьютеров.

Рассмотрим разработанный алгоритм, который позволяет создавать неограниченное (с программной точки зрения) число источников освещения с поддержкой наименьших шейдерных моделей. Метод основывается на использовании в качестве массива данных о освещении – 2D текстуру. Данный подход возможен в связи с тем, что размер входных текстур не ограничен и не зависит от шейдерной модели.

Проведём формализацию задачи. Дано - количество источников освещения i-го вида, , n – количество типов источников, - может быть весьма большим. Необходимо спроектировать систему для расчёта освещения в реальном времени с поддержкой более старых шейдерных моделей.

Разработанный алгоритм имеет следующий вид:

  • Формирование или обновление текстуры индексов
  • Формирование или обновление текстуры информации об источниках
  • Передача полученных текстур в графический конвейер
  • Расчёт освещения
  • Повтор алгоритма для нового кадра

Формирование или обновление текстуры индексов

Текстура индексов хранит информацию о количестве источников освещения и их типе. Каждый пиксель в данной текстуре хранит одно целое число. Пиксели данной текстуры являются массивом чисел - тип i-го источника,  . Размер текстуры подирается так, чтоб её разрешение было степенью двойки. Обновление данной текстуры требуется только при удалении или добавлении источников. Формирование новой текстуры индексов требуется только тогда, когда необходимо изменить разрешение текстуры для более эффективного хранения данных.

 

Рисунок 3. Представление индексной текстуры (2x2) для 2 источников одного типа в памяти

 

Формирование или обновление текстуры информации об источниках

Данная текстура хранит всю информацию об используемых источниках освещения. Каждый пиксель текстуры – четырёх мерный вектор типа float32, который может нести различную информацию. Например, для точечного источника хранятся: позиция, радиус, интенсивность, цвет и т.д. Данную текстуру необходимо обновлять при изменении любого источника освещения. Для этой цели была введена система, которая отслеживает изменения параметров источников и вызывает обновление нужных участков текстуры. Формирование новой текстуры происходит при таких же условиях, как и для текстуры индексов.

 

Рисунок 4. Графическое представление текстуры (2x2) информации для 2 источников одного типа

 

Передача полученных текстур в графический конвейер

Для передачи данных текстур резервируются 2 первых текстурных блока пиксельного шейдера.

 

Рисунок 5. Первые 2 текстурных слота пиксельного шейдера

 

Расчёт освещения

Расчёт освещения запускается для каждого пикселя, видимого на экране. Он заключается в вычислении , где  – вклад i-го источника в освещение данного пикселя. Таким образом, необходимо рассчитать вклад каждого источника освещения и просуммировать для получения конечного освещения. Данная стадия имеет следующий алгоритм:

  • Считать значение из текстуры индексов (полученное значение тип источника)
  • Считать из текстуры с информацией необходимый объём данных и записать в структуру
  • Переместить «каретку», которая указывает на количество уже считанных байт: Позиция каретки += размер считанных данных
  • Передать полученные данные в модель для расчёта освещения
  • Просуммировать результат
  • Повторять алгоритм, пока из индексной текстуры не будет считан 0

Ниже приведена визуализация алгоритма чтения данных. Красная область – пиксели из которых будет проведено чтение, синий прямоугольник – позиция каретки до чтения текущего блока данных.

 

Рисунок 6. Визуализация чтения данных

 

Разработанный алгоритм позволяет рассчитывать неограниченное количество (не считая аппаратных ограничений) источников освещения даже на старых шейдерных моделях. К недостаткам данного алгоритма можно отнести требование однородности входных данных (вся информация должна быть записана в действительных числах, что порой является излишним). Полученный алгоритм легко адаптируется под любые методики расчёта освещения и типы источников. А при дополнении его методикой кластерного рендеринга можно получить значительный прирост к производительности приложения.

 

Список литературы:

  1. James T. Kajiya. The rendering equation, 1986, 143–150 с.
  2. Калютов А. В. Введение в фотореалистичную графику, 2006, - 118с.
Проголосовать за статью
Конференция завершена
Эта статья набрала 6 голосов
Дипломы участников
У данной статьи нет
дипломов

Оставить комментарий

Форма обратной связи о взаимодействии с сайтом
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.