Освещение по Ламберту
Это, видимо, самое сильное упрощение формулы, которое можно придумать. Делаются такие предположения:
V не сильно зависит от P, т.о. V принимается постоянным для всей грани
L не сильно зависит от P, т.о. L принимается постоянным для всей грани
Ks = 0 (то есть грань не отражает свет, а только рассеивает)
нормаль к объекту N равна нормали к грани n в любой точке грани P
В этом случае формула принимает вид
intensity = ambient + amp * cos(n, L),
где n - нормаль к грани.
Причем в этой формуле, по предположениям, нет величин, зависящих от P. Так что освещенность равна константе для всей грани, то есть все точки грани освещены одинаково. Тогда достаточно посчитать ее лишь один раз на грань. Осталось упомянуть, что освещение по Ламберту обычно принято называть flat shading.
Освещение по Гуро
Здесь делаются такие предположения:
Ks = 0 (то есть грань не отражает свет, а только рассеивает) освещенность меняется по грани линейно
Ну, а раз освещенность меняется линейно - так же, как и координаты текстуры u, v - можно использовать точно такую же процедуру, как для старого доброго текстурирования, только вместо двух координат текстуры u, v нам надо будет интерполировать одну величину - освещенность. В вершинах она считается по той же самой формуле (с учетом Ks = 0, конечно),
intensity = ambient + amp * cos(N, L).
Здесь за N в вершине берется как раз нормаль к объекту в вершине (vertex normal), посчитанная так, как описано в 5.2.
То есть, для написания процедуры освещения по Гуро достаточно написать три строчки расчета освещенности (обозначать ее будем c) в вершинах грани по приведенной здесь формуле и заменить в своей процедуре текстурирования u на c, выкинув при этом v (оно нам не нужно, нас интересует только c). Чтобы добавить освещение по Гуро в текстурирование, надо, соответственно, добавить полностью скопированный с расчета u расчет c. Что делать с полученным по цвету найденного через (u, v) в текстуре пиксела и освещенности с, описано в соответствующем пункте.
Заметим, что освещение по Гуро - это не линейная интерполяция освещенности по изображению грани на экране, как это обычно принято и понимать и делать. Освещенность меняется линейно по трехмерной грани, а вовсе не по ее проекции. То есть, вообще говоря, здесь мы тоже должны учитывать перспективу. Правда, линии одинаковой освещенности все равно будут прямыми, но выглядеть картинка, освещенная по Гуро с учетом перспективы, будет все же покорректнее.
1 2 3 4
8 8 8
| |