Что-то с raytracing, которое пошло не так - PullRequest
3 голосов
/ 01 октября 2011

Я пытаюсь выполнить простое задание трассировки лучей в c # (перенесено из python).Мне удалось заставить пример кода показать правильную картинку, но когда я пытаюсь адаптировать его к своему назначению, что-то идет не так.

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

В основном, мое назначение выдает что-то вроде этого:

http://i56.tinypic.com/2vcdobq.png

С включенным зеркальным выделением и

http://i53.tinypic.com/2e1r38o.png

С выключенным.Предположим, он выглядит примерно так:

http://i56.tinypic.com/2m7sxlh.png

Моя формула освещения Phong выглядит следующим образом:

Colour I = diffuse_colour;
Vector L = light.vector;
Vector N = normal; //FIXME!
Colour Is = diffuse_colour * light.intensity;
Colour Ia = new Colour(1,1,1) * light.ambient;
Colour Kd = specular_colour;
Colour Ka = Kd;
double Ks = sharpness ?? 0.4;
Vector H = Vector.unit(view + L);

//Phong Illumination
//I = KaIa + KdIs max(0,L.N) + KsIs (H.N)^n

I = Ka * Ia
+ Kd * Is * Math.Max(0, L.dot(N))
+ Ks * Is * Math.Pow(H.dot(N),200); //FIXME?

И я скопировал ее из рабочего примера кода, поэтому язнаю, что это работает.

Любые мысли были бы великолепны, потому что я в тупике.

Ответы [ 3 ]

4 голосов
/ 01 октября 2011

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

0 голосов
/ 29 апреля 2012

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

www.gamedev.net / страницы / ресурсы / _ / технический / график-программирование-и-теория / Фонг-подсветка объясненного-r667

0 голосов
/ 06 октября 2011

Это было не так просто, как одна реализация в python, а другая в c #.Оказалось, что было две вещи неправильно.

Во-первых, в моем точечном классе один из моих операторов перегрузки был неправильным.(оператор - на 2 пункта, у меня было возвращение вектора (p1.x - p2.x, p1.y - p2.y, p1.x - p2.x) ... где вместо этой последней пары должна была быть pz.

Другая ошибка, которую я допустил, заключалась в том, что при сохранении растрового изображения я перепутал столбцы и строки в единицах x и y (Col = x, Row = y)

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

...