Рисуем тор y x z Qi+1, j+1 Y 0 Z Q X f j P Qi, j+1 Qi+1, j Qi, j
Уравнение освещенности по Фонгу q Фоновое освещение не имеет источника и зависит только диффузном освещении свет от источника q При от сцены равномерно рассеивается во всех направлениях. q При зеркальном освещении свет от источника отражается от повехности. в одном направлении. Зеркальная освещенность дополнительно зависит от положения наблюдателя. . l P’ n r e
Модели Блинна и Шлика q Вычисление отраженного вектора – трудоемкая операция (Блинн) l P’ n r e q Возведение в степень также работает не очень быстро. . . (Шлик)
Уравнение освещенности Open. GL -l v i P’ spoti – коэффициент направленности atti – коэффициент затухания as– фоновое освещение ai , si , di – свойства i-го источника освещения еm , am , sm , dm , hm – свойства материала
Установка параметров освещения в Open. GL q Задаем параметры материала: void gl. Materialfv(GLenum face, GLеnum param, GLfloat *value); face = {GL_FRONT|GL_BACK} param = {GL_AMBIENT|GL_DIFFUSE|GL_EMISSIVE|GL_SPECULAR} value = float[4] // RGBA void gl. Materialf(GLenum face, GL_SHININESS, GLfloat value); q Задаем цвет фонового освещения: void gl. Light. Modelfv(GLеnum param, GLfloat *value); param = LIGHT_MODEL_AMBIENT value = float[4] // RGBA q Задаем цвет источника освещения: void gl. Lightfv(GLenum light, GLеnum param, GLfloat *value); face = {GL_LIGHT 0|GL_LIGHT 1|…} param = {GL_AMBIENT|GL_DIFFUSE|GL_SPECULAR} value = float[4] // RGBA
Установка параметров освещения. Часть 2. q Задаем положение источника освещения: void gl. Lightfv(GLenum light, GL_POSITION, GLfloat *value); face = {GL_LIGHT 0|GL_LIGHT 1|…} value = float[4] // x, y, z, w Координаты источника освещения преобразуются текущей матрицей модельного преобразования! q Включаем расчет освещенности void gl. Enable(GLenum type); type = GL_LIGHTING; q Включаем требуемые источники освещения void gl. Enable(GLenum type); type = GL_LIGHT 0; q Включаем требуемые источники освещения void gl. Shade. Model(GLenum type); type = GL_FLAT; - плоская закраска грани type = GL_SMOOTH - закраска по Гуро
Интерполяция цвета • Вычислить цвет (RGB) в каждой вершине. • Вычислить цвет в точках P 1 и P 2: s = ||P 1 - B|| / ||A - B|| C(P 1) = s(C(A)) - (1 s)(C(B)) • Вычислить цвет в т. Р: s = ||P - P 2|| / ||P 1 - P 2|| C(P) = s(C(P 1))-(1 s)(C(P 2))
Недостатки закраски по Гуро
Интерполяция нормали • Вычислить нормали (RGB) в каждой вершине. • Вычислить нормаль в точках P 1 и P 2: s = ||P 1 - B|| / ||A - B|| N(P 1) = s(N(A)) + (1 s)(N(B)) • Вычислить нормаль в т. Р: s = ||P - P 2|| / ||P 1 - P 2|| N(P) = s(т(P 1))-(1 s)(N(P 2))
Растеризация V 1 V 3 V 2 q Интерполяция координаты z q Интерполяция цвета вдоль примитива закраска по Гуро
Ошибки линейной интерполяции q Освещенность зависит от способа разбиения на примитивы I=0 I=1 I=0 q Поле нормалей лучше задавать в виде текстуры!