2013-04-09 1 views
0

Так что я пытаюсь загрузить OBJ-загрузку в свой raytracer. Загрузка OBJs прекрасна, но у меня возникают проблемы с работой отображения текстур.картинка текстуры Raytracer, оставляющая артефакты

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

enter image description here

Мой профессор сказал, что она выглядит как нормалей назад, но я не думаю, что это так, потому что форма все еще ударил - и цвет «неправильные» треугольники - это цвет фонового цвета текстуры (т. е. черный в этом случае).

Когда я загружаю OBJ, каждая вершина имеет связанную с ним координату UV. Что мне делать, чтобы получить УФ коорд, когда луч попадает в форму следующим образом:

T: the triangle that was hit 
hp: where on the triangle the ray hit 
v1,v2,v3: the vertices of the triangle, each has a UV coord UV1, UV2, UV3 

find the distance to each v[i] from hp (d1,d2,d3 respectively) 
find the weight of each of these (w1 = d1/(d1+d2+d3), same for d2,d3) 
find the weighted UV coord: UV1/w1 + UV2/w2 + UV3/w3 

find the pixel color based on this weighted coord 

Кто-нибудь есть какие-либо идеи, что может быть происходит? Я могу опубликовать части своего кода, если вы думаете, что это поможет.

ответ

1

У вас действительно есть ошибка в вычислении UV-вычислений (независимо от того, есть ли у вас дополнительная ошибка с вашими нормалями).

Причина, по которой я говорю: если у вас есть hp, очень близкий к v1, например, вы получите вес w1, очень близкий к нулю, а когда вы вычислите UV1/w1, он будет стремиться + от ожидаемого значения UV1.

Вы, таким образом, нужно смотреть на barycentric coordinates

+0

После попытки барицентрические COORDS (встроенный метод Vector3.Barycentric), то получается, что это дает тот же результат, что и метод, который я имел прежде. У меня есть идея, которая могла бы работать, хотя ... – Toadums

+0

на основе псевдо-кода, который вы предоставили, это единственная ошибка, которая может быть обнаружена. Все остальное - только случайное предположение (перевернутые нормали, UVs не загружены должным образом, порядок вершин, который неверен по сравнению с UV-порядком и т. Д.). Возможно также, что ваше использование барицентрических координат неверно (оно не может дать/точно/то же самое, в противном случае есть другие вещи, серьезно неправильные, так как формулы разные) – WhitAngl

+0

Я просто понял, что я не разделяю вес, скорее я размножаюсь ... это, вероятно, многое изменит! Мой профессор сказал мне взглянуть на двухлинейную интерполяцию, которая дает очень похожее изображение (хотя значения не совсем то же самое) – Toadums