2013-07-03 3 views
3

Я работал в (очень простой) трассировка лучей программное обеспечение в прошлом на C++. Теперь вы хотите создать усовершенствованную систему (CSG, radiosity и т. Д.) С нуля.Ray Tracing in Haskell

Мне интересно реализовать его в Haskell, потому что я также изучаю функциональное программирование.

Производительность - очень важный факт в трассировка лучей алгоритмов. Программа Haskell в целом медленнее, чем программа на C++. Сколько? Это зависит от контекста.

Учитывая этот контекст (т. Е. потенциально очень сложный RT) можно ли работать в Haskell?

+0

Да, это жизнеспособно, и в Haskell уже много лучей трассировщиков (как в Hackage, так и в других местах). Вы должны сделать свой вопрос намного точнее, если вы хотите получить хороший ответ. –

+0

Да, существуют высокоэффективные трассирующие лучи из луча. Это законный выбор языка. Однако, если вы новичок в Haskell и уже знаете C++, вы будете писать лучше/быстрее C++, чем Haskell. – jozefg

ответ

7

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

Все зависит от этого. Если вы пишете код C для абсолютной производительности, вы, скорее всего, не отправитесь в избили C с Repa, потому что анализ псевдонимов на данный момент не очень хорош. Но если вы не скомбинируете свой C-код в одну монолитную функцию, я подозреваю, что вы получаете выгоды от слияния, а «свободный параллелизм» в Repa может помочь ему конкурировать.

http://code.ouroborus.net/gloss/gloss-head/gloss-examples/raster/Ray/

http://www.youtube.com/watch?v=jBd9c1gAqWs

И не используйте списки. Если вы не хотите использовать Repa, я предлагаю вам использовать Data.Vector.Unboxed.

3

Я относительно новичок в Haskell. Я чуть-чуть переделал детектор фрактальных лучей кватерниона в битбакет, написанный в Haskell по адресу https://bitbucket.org/ratzes/hray/src.

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

Я использовал библиотеку Repa (Хороший учебник по Repa here), который, на мой взгляд, был идеален для моей программы трассировки лучей. Это позволило мне указать функцию для вычисления «удара» для конкретного фотона, а затем автоматически распараллеливала эту функцию над каждым из фотонов.

Понятно, что трассировка фрактальной лучи проще, чем трассировка луча лучей, потому что вы можете пробовать в любой точке пути «фотонов», чтобы спросить, сталкивается ли она. Кроме того, не реализовал ничего такого, как radiosity или caustics, поэтому я не могу прокомментировать, насколько хорошо такие вещи, как эти масштабы.

+3

Привет, ваше репо является частным ... – ThorinII

Смежные вопросы