Собственная реализация фонг освещения с лучевым литьем
Я пытаюсь написать программу на языке java с нуля, которая отображает сферу с техникой приведения лучей и подсветкой фонг, но я немного растерялся.
Я понимаю концепцию, лежащую в основе коэффициентов уравнения Фонга, но я не понимаю, как получить значения вектора, и как все это связано с приведением лучей
скажем, я хочу визуализировать сферу в середине моего экрана, и у меня есть ее позиция и радиус, поэтому (cx,cy,r). Где именно я начинаю сейчас? как именно я получаю векторные значения? моя идея заключается в следующем (псевдокод)
int cx = window width/2
int cy = window height/2
int r = 30;
for(i = 0 -> window height) {
for(j = 0 -> window width) {
if( (j-cx)^2 + (i-cy)^2 < r^2) {
//point inside
Color c = phong(arguments..)
draw pixel j,i with color c
}
}
}
но я понятия не имею, если это правильно или нет, и если это так, как я могу получить векторные значения, для начала, Normal?
не могли бы вы указать мне правильный путь? Я пытался много гуглить безуспешно, заранее спасибо
1 ответ
Векторы для вычисления нормали обычно поступают из тесселяции (аппроксимации) реального геометрического объекта. Итак, вы разбиваете сферу, скажем, на треугольники. Тогда каждый треугольник (p1,p2,p3) имеет свой собственный нормальный вектор ((p2-p1)×(p3-p1).
Метод затенения по фонгу - это интерполяция, которая затем (в идеале) размывает линии, которые выделяют тот факт, что вы рисуете треугольники вместо истинной сферы. Это не помогает с углами по бокам, хотя.:(
Для тесселяции один из способов состоит в том, чтобы аппроксимировать сферу поверхностными пятнами Безье, которые затем можно подразделить на достаточно малые размеры и упростить до треугольников. Мой вопрос здесь посвящен выполнению этой работы, чтобы нарисовать чайник (в основном поверхности вращения, не похожие на сферы).