Python (или нет …) фреймворк для GPU / параллельной трассировки лучей?

#python #graphics #3d #simulation #raytracing

#python #графика #3D #Симуляция #трассировка лучей

Вопрос:

Я провожу технические исследования для своего следующего проекта и пока не нашел ничего подходящего, поэтому я даю SO попробовать.

Проблема, которую я пытаюсь решить, заключается в следующем:

  • У меня много (сотни / тысячи) процедурно сгенерированных сцен, каждая из которых состоит из ~ 10 тыс. кубов.
  • В каждом из них я хотел бы проверить 1k-10k лучей и получить статистику по расстоянию попадания.
  • Это не проблема рендеринга — не все лучи исходят из одной и той же позиции. (Таким образом, трассировка лучей на основе глубины менее подходит)
  • Производительность имеет значение. Я бы хотел, чтобы базовый код был либо на основе GPU, либо с возможностью параллелизации C.

Есть ли фреймворк, который позволяет мне делать такие вещи? Я смотрел на игровые движки, но в основном не отслеживал. Я предпочитаю найти фреймворк python framework, который делает это, но также остановится на других языках (C # / C ).

Каков наилучший способ решения такой проблемы?

Комментарии:

1. Вы можете легко сделать это в Unity. Мы поддерживаем трассировку лучей. Вы также можете реализовать это самостоятельно в сцене. В Интернете есть несколько примеров, показывающих, как заполнить текстуру из вычислительного шейдера.

2. Спасибо! Ближайший случай, который я нашел, был таким: github.com/superdump/unity-compute-shader-ray-tracer Однако он отслеживает лучи, тестируя их на каждом объекте (предупреждает о сценах с более чем несколькими сотнями следов), и я не уверен, что он распараллеливается (запускает 10000 лучей, ждет результатов, обрабатывает). Я бы ожидал, что будет какой-то алгоритм, который предварительно обрабатывает сцену для создания более эффективного решения для трассировки лучей, а затем использует это… Может быть, я слишком оптимистичен.

Ответ №1:

Какие игровые движки вы искали? Потому что Unreal и Unity, два самых популярных движка на рынке, уже имеют поддержку. В Python найти хорошую библиотеку или фреймворк может быть сложнее, потому что в Python нет отличной экосистемы для игровых движков.

https://docs.unrealengine.com/en-US/Engine/Rendering/RayTracing/index.html

https://docs.unrealengine.com/en-US/Engine/Rendering/RayTracing/RayTracingSettings/index.html

https://developer.nvidia.com/blog/introducing-ray-tracing-in-unreal-engine-4/

https://unity.com/ray-tracing

https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@7.1/manual/Ray-Tracing-Getting-Started.html

Обновить:

В Python есть движок PyGame с открытым исходным кодом, который может иметь некоторую поддержку, но я не уверен, что он стабилен.

https://www.pygame.org/project/4743/6980

После некоторых исследований я также нашел пакет на Python, который может работать без игрового движка, вы могли бы попробовать

https://pypi.org/project/ntracer/

Комментарии:

1. Спасибо за ресурсы! Я хорошо осведомлен о трассировке лучей в играх. Разница между моим вариантом использования и тем, что популярно в играх, заключается в том, что трассировка лучей игрового движка всегда используется для использования с одним источником (камерой). На этом основана вся стратегия выборки. В моем случае я буду запускать 30-50 лучей из ~ 100 исходных точек на сцену, что делает эти подходы неэффективными.

Ответ №2:

Отвечая на мой собственный вопрос. После довольно продолжительных исследований мы остановились на Trimesh ( https://trimsh.org/trimesh.html ).

Он включает в себя

  • Совместимость с популярными форматами геометрии (gltf, obj, dae)
  • Поддержка быстрой трассировки лучей с помощью pyembree (на основе проекта Intel embree)
  • Поддерживает пакетные запросы (отправка рентгеновских запросов, получение рентгеновских ответов обратно), чтобы избежать узкого места связи python <-> C.