Собственная реализация фонг освещения с лучевым литьем

Я пытаюсь написать программу на языке 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).

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

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

Другие вопросы по тегам