Пожалуй, ни одна 3д компьютерная игра не обходит стороной такой эффект, как освещение. Реализаций множество, я же расскажу теорию того, что происходит в недрах графического конвеера для лучшего понимания происходящего. Существует несколько основных моделей освещения - алгоритмов просчета цвета пикселя: - Равномерное(ambient) освещение - Диффузное(diffuse) освещение - Бликовое(specular) освещение Равномерное освещение Самое простое. Не зависит ни от каких параметров и лишь задаёт начальное освещение объектов окружающей средой. Code Color = Ambient * AmbientIntensity;
,где Ambient - цвет объекта, AmbientIntensity - яркость источника света Диффузное освещение Эта модель учитывает направление источника света и направление нормали(перпендикуляра) к поверхности. Пусть L - вектор направления света, а N - нормаль, тогда коефициент яркости пикселя имеет значение скалярного произведения этих двух векторов. Т.е.: Code Color = Diffuse * DiffuseIntensity * DotProduct(L,N);
,где Diffuse - рассеиваемый цвет объекта, DiffuseIntensity - яркость рассеиваемого света источника света, DotProduct() - скалярное произведение. Бликовое освещение Часто мы замечаем, что под некоторым углом обзора объекты (их часть)становятся очень яркими. Это происходит из-за отражения света, при котором, как вам наверняка известно из школьного курса геометрической оптики, угол падения равен углу отражения. Эта модель учитывает также положение глаз наблюдателя. Сохраняя все предыдущие обозначения добавим R - вектор отражения света от поверхности и V - вектор от глаз наблюдателя. Тогда: Code R = Reflect(-V,N); Color = Specular * SpecularIntensity * DotProduct(V,R);
,где Specular - отражаемый цвет объекта, SpecularIntensity - яркость отражаемого света источника света, DotProduct() - скалярное произведение. Чтобы добиться максимального эффекта, эти модели комбинируют: Code Color = (Diffuse) * (Ambient) * (Specular^k);
Это лишь основные модели, есть множество других, которые можно применить в вашей программе с помощью шейдеров. Надеюсь, эта статья создала некоторое представление о вычислении цвета в трёхмерной графике у тех, кто ещё не знаком с этим.
|