Освещение и текстурирование в OpenGL

Содержание

Слайд 2

Диффузное и зерк альное отражение

Диффузное и зерк альное отражение

Слайд 3

Диффузное отражение

Интенсивность освещения рассчитывается отдельно для каждой компонент R, G и

Диффузное отражение Интенсивность освещения рассчитывается отдельно для каждой компонент R, G и B.
B.

Слайд 4

Зеркальное отражение

Зеркальное отражение рассчитывается по закону Фонга

Зеркальное отражение Зеркальное отражение рассчитывается по закону Фонга

Слайд 5

Уравнение освещенности

l

n

h

P’

e

Фоновое освещение не имеет источника и зависит только от сцены

Уравнение освещенности l n h P’ e Фоновое освещение не имеет источника
При диффузном освещении свет от источника равномерно рассеивается во всех направлениях.

При зеркальном освещении свет от источника отражается от повехности.в одном направлении. Зеркальная освещенность дополнительно зависит от положения наблюдателя.

Слайд 6

Рисуем тор

x

y

z

φ

0

X

Z

Y

ϕ

P

Q

Qi,j

Qi+1,j

Qi+1,j+1

Qi,j+1

Рисуем тор x y z φ 0 X Z Y ϕ P

Слайд 7

Уравнение освещенности OpenGL

еm ,am , sm , dm , hm – свойства

Уравнение освещенности OpenGL еm ,am , sm , dm , hm –
материала

ai ,si ,di – свойства i-го источника освещения

as– фоновое освещение

atti – коэффициент затухания

spoti – коэффициент направленности

-l

vi

P’

Слайд 8

Установка параметров освещения в OpenGL

void glMaterialfv(GLenum face,GLеnum param,GLfloat *value);
face = {GL_FRONT|GL_BACK}

Установка параметров освещения в OpenGL void glMaterialfv(GLenum face,GLеnum param,GLfloat *value); face =
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

Задаем параметры материала:

Задаем цвет источника освещения:

Задаем цвет фонового освещения:

Слайд 9

Установка параметров освещения. Часть 2.

void glLightfv(GLenum light, GL_POSITION,GLfloat *value);
face = {GL_LIGHT0|GL_LIGHT1|…}

Установка параметров освещения. Часть 2. void glLightfv(GLenum light, GL_POSITION,GLfloat *value); face =
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 - закраска по Гуро

Слайд 10

Растеризация

V1

V2

V3

Интерполяция цвета вдоль примитива - закраска по Гуро

Интерполяция координаты z

Растеризация V1 V2 V3 Интерполяция цвета вдоль примитива - закраска по Гуро
Интерполяция цвета вдоль примитива - закраска по Фонгу

Слайд 11

I=0

I=0

I=1

I=1

I=0

I=0

I=1

I=1

Фонг и Гуро - ошибки интерполяции

Освещенность зависит от способа разбиения на

I=0 I=0 I=1 I=1 I=0 I=0 I=1 I=1 Фонг и Гуро -
примитивы

Поле нормалей лучше задавать в виде текстуры!

Слайд 12

Текстурирование

u

v

0

x

y

0

“Перспективное” текстурирование:

1

1

x1,y1,u1,v1

x2,y2,u2,v2

x3,y3,u3,v3

Текстурирование u v 0 x y 0 “Перспективное” текстурирование: 1 1 x1,y1,u1,v1 x2,y2,u2,v2 x3,y3,u3,v3

Слайд 13

Текстурирование в OpenGL

GLuint texture;
glGenTextures(1,&texture);

Создаем текстуру - прямоугольный массив с цветами пикселов.

Текстурирование в OpenGL GLuint texture; glGenTextures(1,&texture); Создаем текстуру - прямоугольный массив с
Высота и ширина должны быть степенями двойки.

RGBNM


RGB1M

RGB0M





RGBN1


RGB11

RGB01

RGBN0


RGB10

RGB00

Получаем номер текстурного объекта

Активизируем текстурный объект

glBindTexture(texture);

Слайд 14

Текстурирование в 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,

Текстурирование в 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); // Исходные данные