Трассировка Лучей. Могу Ли Я Ускорить Рендеринг Изображения Из Облака Лучей С Помощью Графического Процессора?

  • Автор темы Viclipucli
  • Обновлено
  • 22, Oct 2024
  • #1

Начните с заранее рассчитанного «облака лучей» — отправной точки и направления большого количества лучей, большая часть которых не будет способствовать изображению. Затем задаются положение и ориентация плоскости изображения, и задача состоит в том, чтобы найти в облаке лучей лучи, которые пересекают плоскость изображения без перекрытия другими объектами, и вывести полученные значения пикселей. Никаких отражений лучей не потребуется, поскольку вся работа по созданию облака лучей уже проделана. Остался единственный шаг — преобразовать лучи в изображение. Это означает, что однолучевое облако можно использовать для создания изображений под произвольными углами обзора.

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


Чтобы уточнить, РичиСэмс' понимание верно:

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

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

#трассировка лучей #gpu

Viclipucli


Рег
23 Jun, 2014

Тем
61

Постов
181

Баллов
516
  • 26, Oct 2024
  • #2

Я не совсем уверен, что полностью понимаю проблему, думаю, вы спрашиваете вот о чем:

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


Имея в виду эту цель, я бы сделал следующее:

  1. Создайте 2 буфера изображений
    1. Для накопленного цвета
    2. Чтобы отслеживать количество обращений
  2. Очистите буфер накопления до черного цвета, а буфер hitCount до всех нулей.
  3. Создание ядра для каждого луча
    1. Используйте классическую математику трассировки лучей, чтобы найти ближайшее пересечение
      • Здесь вы можете делать что угодно, от простого «перебора всех объектов сцены» до чего-то вроде BVH или kd-деревьев.
    2. Если ближайшее пересечение — это плоскость изображения, используйте матрицу WorldView для плоскости изображения, чтобы преобразовать точку пересечения из мировых координат для просмотра пространственных координат.
    3. Используйте координаты x, y точки пересечения пространства изображения, чтобы получить координаты пикселей буфера изображения.
    4. Добавляем цвет луча к соответствующему пикселю в буфере накопления
    5. Увеличить значение соответствующего пикселя в буфере hitCount.
      • Для 4 и 5 вы также можете использовать фильтр, чтобы применить цвет к нескольким пикселям, а не только к одному. В этом случае вы должны добавить значение меньше 1 в буфер hitCount.
  4. На ЦП или в другом проходе на пиксель:
    1. Разделите накопленный буфер цвета на буфер hitCount.


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

 

Damirov


Рег
06 Jan, 2011

Тем
79

Постов
229

Баллов
634
  • 26, Oct 2024
  • #3

Похоже, самое сложное — это последний шаг, на котором каждый луч влияет на соседние пиксели. Я бы рассмотрел подход, при котором вы выполняете первые шаги как обычно (параллельно, как на ЦП) без последнего шага, а затем выполняете этот последний бит в новом проходе. Я не уверен, как именно работают ваши лучевые вклады, поэтому сложно сказать, но похоже, что вы сможете использовать результаты первой части в качестве входных данных, а затем выполнить операцию во втором проходе.

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

 

@lex2006


Рег
18 May, 2006

Тем
80

Постов
191

Баллов
631
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно