Этот способ очень прост и полностью поддерживается средствами библиотеки OpenGL. В ряде случаев он дает вполне приемлемые результаты. Однако ему свойственны также весьма серьезные недостатки. Одним из них является зависимость освещенности грани от положения наблюдателя.
Рассмотрим это явление подробнее. Пусть задана грань abcd (рис. 10.3), где в скобках указаны значения освещенности для каждой из вершин.
Рис. 10.3
Тогда для одних положений наблюдателя растеризация грани будет происходить параллельно АС, а для других - параллельно Вй.
В первом случае при интерполяции вдоль АС мы получим значение единица и, следовательно, освещенность в точке О также будет равна единице.
Во втором случае для получения освещенности в точке О интерполяция будет происходить по отрезку ВО и искомое значение освещенности будет тождественно равно нулю вдоль данного отрезка и, следовательно, в самой точке О.
Поэтому если наблюдатель двигается вокруг этой грани, то величина освещенности в точке О будет меняться в зависимости от его положения, что неверно.
Работа с картами освещенности
Другими недостатками данного подхода является некорректная обработка теней и отсутствие бликов внутри граней. Последнее вытекает из того, что при билинейной интерполяции освещенности максимальное значение не может превосходить значения в вершинах.
Данные недостатки особенно заметны при работе с большими гранями. Использование граней меньшего размера уменьшает влияние этих недостатков, но за это приходится расплачиваться значительным увеличением как общего числа вершин, так и общего числа граней. Все это ведет к росту затрат на обработку всей сцены.
Одно из наиболее простых и изящных решений этой задачи было предложено Джоном Кармаком и использовано в игре Quake. Утверждается, что однажды вечером Кармак (размышлявший над организацией освещенности в игре) обратил свое внимание на пятно света на стене. Тогда и пришла идея, что это пятно (как и всю освещенность) можно представить просто как дополнительную текстуру, накладываемую на грани поверх основной текстуры. Эти текстуры (называемые картами освещенности, lightmaps) заранее, на этапе подготовки сцены строятся для каждой грани. Обычно карты освещенности рассчитываются с заметно меньшим разрешением, чем основные текстуры.