2015-07-15 2 views
-1

То, что я пытаюсь сделать, - это улучшение моего реального Ray Tracer для создания распределенного Ray Tracer. Я бродил по интернету, и все, что я мог бы нашел о его реализации было только короткие вещи, как:Основная идея распределенного лучевого трассировщика

-replace один луч с распределением лучей -Shoot несколько лучей, распределенных на интервале -Shoot несколько лучей через каждый пиксель и варьировать каждый луч случайным образом

Мой вопрос: что означает «распределение»? Как я могу изменить распределение лучей, проходящих через пиксель? В моем обычном Ray Tracer я снимаю один луч за пиксель. Для «распределения» лучей я могу понять, что я должен снимать несколько лучей вместо одного. Но в то же время я снимаю луч через свой пиксель с координатами (x, y).

for (int x = 0; x < WINDOW_WIDTH; x++) 
{ 
    for (int y = 0; y < WINDOW_HEIGHT; y++) 
    { 
     Vec3<float> rayDir = camera->pixelToWorld(x, y) - camera->position; 
    } 
} 

Итак, как я могу «варьировать каждый луч случайно»? Благодарю.

+0

То, как я это делал (по общему признанию, давным-давно), состоял в том, чтобы разделить строки выходного pixmap на N примерно равных по размеру разделов и передать каждый подраздел одному из N рендер-работников. Это достаточно хорошо для начала; то когда это работает, проблема в том, что некоторые работники закончат быстрее других; в этом случае рабочий, который закончил, может связаться с работником, который еще не закончил и предлагает ему помочь; затем рабочий работник может передать (половина строк, которые он еще должен закончить), к запрашивающему работнику. Повторяйте до тех пор, пока все строки не будут отображены, а затем повторно соберите изображение. –

ответ

1

Есть несколько обычаи распределенной трассировки лучей, он может быть использован для:

(1) антиалиасинга

(2) глубина резкости эффектов

(3) движения размытия эффектов

Для (1) идея состоит в том, чтобы запускать в каждом пикселе пучок лучей вместо одного луча.Каждый луч будет выброшен через центр пикселя немного дрожал случайными dx и dy (dx и dy будет меньше размера пикселя).

Для (2) это немного сложнее, но это примерно такая же идея: каждый луч снимается как линия, которая начинается с наблюдателя и проходит через центр пикселя (возможно, дрожит, если вы делаете (1), но давайте теперь забудем об этом сейчас). На этот раз это положение наблюдателя, в котором вы дрожите, вы немного измените положение наблюдателя в направлении, ортогональном экрану. Опять же, усредняя вклад нескольких лучей в каждом пикселе, фон будет более «размытым», чем передний план, потому что луч будет отклоняться больше в фоновом режиме.

Для (3) это как раз та же идея, но на этот раз это положение движущихся объектов, которые дрожат.

Примечание: существует также (4): сложные материалы с глянцевыми эффектами (они требуют, чтобы понять немного материала, понятие BRDF = функция распределения двунаправленного отражения).

+0

Хорошо, отлично! Это дает мне уже более четкое представление о том, что я должен делать. Несколько вопросов больше, если это возможно: 1) как найти размер пикселя? Например, мое изображение имеет размер 512x512. Если мне нужно немного дрожать, как вы сказали, мне нужен размер моего пикселя. 2) что такое «хорошее» количество лучей, которое можно снимать в пиксель? Просто иметь идею. На мой взгляд, это может быть как 4, так и 100, например .. так .. просто иметь представление о том, что «обычно» дает уже хороший результат. Благодаря! – Tarta

+0

1) Если вы указали свою точку зрения как в: http://www.povray.org/documentation/view/3.7.0/246/, то у вас есть точка (местоположение) и три вектора (lookat, right and up) , Если местоположение находится в ординаре, то плоскость изображения находится на расстоянии касательной (угол) от оси ординат вдоль направления взгляда, это дает формулу для отображения пикселя координаты (X, Y) в 3D: – BrunoLevy

+0

(x, y, z) = orign + tangent (angle) * lookat + (X/width - 0.5 + jitterX) * right + (Y/height - 0.5 + jitterY) * up, где jitterX и jitterY являются случайными числами с плавающей запятой между 0 и 1. – BrunoLevy

0

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

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

Все рабочие узлы равны, что означает отсутствие различий в типах заданий, которые они могут выполнять. Это позволяет добавить столько рабочих узлов, сколько вы хотите (ПРИМЕЧАНИЕ: будет предел тому, сколько вы можете добавить, прежде чем вы начнете получать отрицательные результаты).

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

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

while(active) 
{ 
    fetch next job from job queue 
    if no job is available 
    { 
     sleep(1) 
     continue 
    } 

    process job 
} 

Что-то, что вам нужно решить, в чем заключается «работа». Является ли один луч? Есть ли один луч и все его последующие отскоки? Это партия лучей? Это решение балансировки нагрузки будет зависеть от вашего трассировщика луча. Единственного луча, вероятно, недостаточно, но это хорошая отправная точка. Фактически, вы, вероятно, должны начать с того, чтобы иметь только один луч на пиксель и сделать одно задание на луч. Это даст вам хорошую базовую линию, чтобы начать работу с момента ее работы.

Удачи вам!

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