Освещение и текстурирование в OpenGL Астана 2004 Лекция 10
Диффузное и зерк альное отражение
Диффузное отражение Интенсивность освещения рассчитывается отдельно для каждой компонент R, G и B.
Зеркальное отражение Зеркальное отражение рассчитывается по закону Фонга
Уравнение освещенности l n h P e Фоновое освещение не имеет источника и зависит только от сцены При диффузном освещении свет от источника равномерно рассеивается во всех направлениях. При зеркальном освещении свет от источника отражается от повехности.в одном направлении. Зеркальная освещенность дополнительно зависит от положения наблюдателя.
Рисуем тор x y z 0 X Z Y P Q Q i,j Q i+1,j Q i+1,j+1 Q i,j+1
Уравнение освещенности OpenGL е m,a m, s m, d m, h m – свойства материала a i,s i,d i – свойства i -го источника освещения a s – фоновое освещение att i – коэффициент затухания spot i – коэффициент направленности -l vivi P
Установка параметров освещения в OpenGL void glMaterialfv(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 glMaterialf(GLenum face,GL_SHININESS,GLfloat value); void glLightModelfv(GLеnum param,GLfloat *value); param = LIGHT_MODEL_AMBIENT value = float[4] // RGBA void glLightfv(GLenum light,GLеnum param,GLfloat *value); face = {GL_LIGHT0|GL_LIGHT1|…} param = {GL_AMBIENT|GL_DIFFUSE|GL_SPECULAR} value = float[4] // RGBA Задаем параметры материала: Задаем цвет источника освещения: Задаем цвет фонового освещения:
Установка параметров освещения. Часть 2. void glLightfv(GLenum light, GL_POSITION,GLfloat *value); face = {GL_LIGHT0|GL_LIGHT1|…} value = float[4] // x,y,z,w Задаем положение источника освещения: Координаты источника освещения преобразуются текущей матрицей модельного преобразования! Включаем расчет освещенности void glEnable(GLenum type); type = GL_LIGHTING; Включаем требуемые источники освещения void glEnable(GLenum type); type = GL_LIGHT0; Включаем требуемые источники освещения void glShadeModel(GLenum type); type = GL_FLAT; - плоская закраска грани type = GL_SMOOTH - закраска по Гуро
Растеризация V1V1 V2V2 V3V3 Интерполяция цвета вдоль примитива - закраска по Гуро Интерполяция координаты z Интерполяция цвета вдоль примитива - закраска по Фонгу
I=0 I=1 I=0 I=1 Фонг и Гуро - ошибки интерполяции Освещенность зависит от способа разбиения на примитивы Поле нормалей лучше задавать в виде текстуры!
Текстурирование u v 0 x y 0 Перспективное текстурирование: 1 1 x 1,y 1,u 1,v 1 x 2,y 2,u 2,v 2 x 3,y 3,u 3,v 3
Текстурирование в OpenGL GLuint texture; glGenTextures(1,&texture); Создаем текстуру - прямоугольный массив с цветами пикселов. Высота и ширина должны быть степенями двойки. RGB NM …RGB 1M RGB 0M ………… RGB N1 …RGB 11 RGB 01 RGB N0 …RGB 10 RGB 00 Получаем номер текстурного объекта Активизируем текстурный объект glBindTexture(texture);
Текстурирование в OpenGL: часть 2 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); Загружаем текстуру Устанавливаем режимы текстурирования glPixelStorei(GL_UNPACK_ALIGNMENT,1); glTexImage2D(GL_TEXTURE_2D, 0, // Mip-level GL_RGB, // Формат текстуры tex_width,tex_height, 0, // Ширина границы GL_RGB, // Формат исходных данных GL_UNSIGNED_BYTE, // Тип данных tex_bits); // Исходные данные
Текстурирование в OpenGL: часть 3 Разрешаем текстурирования Задаем текстурные координаты glEnable(GL_TEXTURE_2D); glTexCoord2d(u,v); Возможно, потребуется включить режим перспективного текстурирования glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); Возвращаем номер текстурного объекта в список свободных glDeleteTextures(1,&texture);