Современные графические технологии

Содержание

Слайд 2

Методы создания изображений

Точность и реалистичность:
Трассировка лучей
Излучательность
Фотонные карты

Скорость:
Полигональная графика

Методы создания изображений Точность и реалистичность: Трассировка лучей Излучательность Фотонные карты Скорость: Полигональная графика

Слайд 3

Полигональное представление объектов

Для каждой вершины заданы:
Координаты вершины
Нормаль
Координаты текстуры
И

Полигональное представление объектов Для каждой вершины заданы: Координаты вершины Нормаль Координаты текстуры
много чего еще ...

Объект задан набором вершин, которые объединены в плоские грани, чаще всего – треугольные.

Слайд 6

GPU vs. CPU

> 3 млрд. транзисторов
Тактовая частота 700Mhz
1.5GB GDDR5 памяти

??? транзисторов

GPU vs. CPU > 3 млрд. транзисторов Тактовая частота 700Mhz 1.5GB GDDR5
Тактовая частота 825Mhz
1-2GB 1300 MHz памяти

Тактовая частота 3.3Ghz
1.17 млрд. транзисторов (six core)

GF100

RV870

Core i7-980X

Слайд 7

GPU vs. CPU (4 года назад)

120 млн. транзисторов
Тактовая частота 500Mhz
128MB 500MHz памяти

GPU vs. CPU (4 года назад) 120 млн. транзисторов Тактовая частота 500Mhz
107 млн. транзисторов
Тактовая частота 325Mhz
128MB 310MHz памяти

Тактовая частота 1.6Ghz – 3.06Ghz
42 млн. Транзисторов (core)

NV30

R300

Слайд 8

Архитектура GF100

Архитектура GF100

Слайд 9

Буфер кадра

Буфер кадра – прямоугольный массив структур

1280

1024

Буфер кадра Буфер кадра – прямоугольный массив структур 1280 1024

Слайд 10

2D-ускорители

Копирование и перемещение прямоугольных блоков

Отрисовка курсора мыши

Отрисовка прямых линий

2D-ускорители Копирование и перемещение прямоугольных блоков Отрисовка курсора мыши Отрисовка прямых линий
и других примитивов

Масштабирование прямоугольных блоков

Прикладная
программа

Win32 API

Драйвер

Видеокарта

Слайд 11

Графический конвейер

T&L:
Преобразование
и освещение

Rasterization:
Разбиение примитивов
на пиксели

Pixel Ops:
Запись пиксела
в буфер кадра

Vi={P,n,…}
Fj={V1,V2,V3}

Vi’={P’,RGBA,…}

{

Графический конвейер T&L: Преобразование и освещение Rasterization: Разбиение примитивов на пиксели Pixel
xi,yi,zi,RGBAi }

{ xi,yi,zi,RGBAi }

Fj’={V1,V2,V3}

Слайд 12

3D-ускорители

T&L

Rasterization

Pixel Ops

Прикладная
программа

OpenGL
Direct3D

Драйвер

Видеокарта

“Ускоряются” этапы T&L и растеризации

Взаимодействие с программой при помощи

3D-ускорители T&L Rasterization Pixel Ops Прикладная программа OpenGL Direct3D Драйвер Видеокарта “Ускоряются”
специальных API

Слайд 13

Поколение 4: Шейдеры

R250-R580

T&L

Rasterization

Pixel Ops

NV25-NV47

dp4 r0.x, v0, c[0]
dp4 r0.y, v0, c[1]
dp4

Поколение 4: Шейдеры R250-R580 T&L Rasterization Pixel Ops NV25-NV47 dp4 r0.x, v0,
r0.z, v0, c[2]
dp4 r0.w, v0, c[3]
mov oD0, c[4] ; Output color
mov oPos, r0 ; Output vertex

ps.1.0 // DX8 Version.
tex t0 // n-map.
texm3x3pad t1, t0_bx2 texm3x3pad t2, t0_bx2 v0_bx2 texm3x3tex t3, t0_bx2 dp3_sat r0, t3_bx2,

Слайд 14

OpenGL – многоплатформенная библиотека функций для создания интерактивных 2D и 3D приложений.

OpenGL – многоплатформенная библиотека функций для создания интерактивных 2D и 3D приложений.
http://www.opengl.org

http://www.opengl.org.ru

GLut – многоплатформенная библиотека вспомогательных функций для создания оконных приложений, использующих OpenGL

Позволяет скрыть особенности программирования под
данную оконную систему.

Отраслевой стандарт с 1992 года

Слайд 15

OpenGL: клиент-сервер

/* прикладная программа */
#include
#include

glEnable(GL_TEXTURE_2D);
glBegin(GL_TRIANGLES);

glTexCoord2d(0.5,0.5);
glVertex3f(1.0,0.5,-0.2);

glEnd();

Сервер OpenGL
Буфер кадра,
Буфер глубины,
Буфер трафарета,
Буфер аккумулятора.

OpenGL: клиент-сервер /* прикладная программа */ #include #include … glEnable(GL_TEXTURE_2D); glBegin(GL_TRIANGLES); …

Слайд 16

Что нужно для работы с OpenGL

.cpp

opengl32.lib

gl.h

glu32.lib

glu.h

glut32.lib

glut.h

opengl32.dll

glu32.dll

glut32.dll

.exe

C++

Что нужно для работы с OpenGL .cpp opengl32.lib gl.h glu32.lib glu.h glut32.lib

Слайд 17

Литература (1/5)

Ю. Тихомиров. OpenGL. Программирование трехмерной графики, БХВ – Петербург, 2002

Эдвард Энджел.

Литература (1/5) Ю. Тихомиров. OpenGL. Программирование трехмерной графики, БХВ – Петербург, 2002
Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2-е изд., Вильямс, 2001

Слайд 18

Литература (2/5)

Ву Мейсон, Нейдер Джеки, Девис Том, Шрайнер Дейв. OpenGL. Руководство по

Литература (2/5) Ву Мейсон, Нейдер Джеки, Девис Том, Шрайнер Дейв. OpenGL. Руководство
программиста. Диа-Софт, 2002.

Френсис Хилл. OpenGL. Программирование компьютерной графики. Для профессионалов. Питер. 2002

Слайд 19

Литература (3/5)

Гайдуков С.OpenGL. Профессиональное программирование трехмерной графики на C++. - БХВ-Петербург, 2004

Литература (3/5) Гайдуков С.OpenGL. Профессиональное программирование трехмерной графики на C++. - БХВ-Петербург, 2004

Слайд 20

Литература (4/5)

Боресков А.В. Расширения OpenGL. -
СПб.: БХВ-Петербург, 2005

Дж. Рост OpenGL.

Литература (4/5) Боресков А.В. Расширения OpenGL. - СПб.: БХВ-Петербург, 2005 Дж. Рост
Трехмерная графика и язык программирования шейдеров - СПб.: Питер, 2005

Слайд 21

Литература (5/5)

Миллер Т. DirectX 9 с управляемым кодом. Программирование игр и графика.

Литература (5/5) Миллер Т. DirectX 9 с управляемым кодом. Программирование игр и
– КомБук, 2005.

Горнаков  С. DirectX 9. Уроки программирования на C++. – БХВ, 2004.

Слайд 22

Где взять GLut?

http://www.opengl.org/developers/
documentation/glut/index.html

http://www.xmission.com/~nate/glut.html

http://www.xmission.com/~nate/glut/glut-3.7.6-bin.zip

http://www.xmission.com/~nate/glut/glut-3.7.6-src.zip

Где прочитать про

Где взять GLut? http://www.opengl.org/developers/ documentation/glut/index.html http://www.xmission.com/~nate/glut.html http://www.xmission.com/~nate/glut/glut-3.7.6-bin.zip http://www.xmission.com/~nate/glut/glut-3.7.6-src.zip Где прочитать про GLut?
GLut?

http://www.opengl.org.ru/coding/glut/ - работа с GLut

Слайд 23

Самая простая программа

#include
#include
void reshape(int w, int h)
{ /* Здесь обрабатываем изменение

Самая простая программа #include #include void reshape(int w, int h) { /*
размеров окна */ }
void display(void)
{ /* Здесь помещаются команды рисования */ }
void idle(void)
{ /* Здесь происходит анимация */ }
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
// GLUT_DOUBLE|GLUT_DEPTH|GLUT_STENCIL|GLUT_ACCUM
glutCreateWindow(“Самая простая программа”);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}

Слайд 24

Работа с буфером кадра

void glClear(GLenum buffers);
buffers = GL_COLOR_BUFFER_BIT|
GL_DEPTH_BUFFER_BIT|
GL_ACCUM_BUFFER_BIT|
GL_STENCIL_BUFFER_BIT

void glClearColor(GLclampf

Работа с буфером кадра void glClear(GLenum buffers); buffers = GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT| GL_ACCUM_BUFFER_BIT|
red,GLclampf green,
GLclampf blue,GLclampf alpha);

Задание цвета для заполнения буфера кадра

Заполнение экранных буферов

Представление цвета в OpenGL

Слайд 25

Преобразование координат: viewport

void glViewport(GLint x,GLint y,
GLsizei w,GLsizei h);

w

h

void glDepthRange(GLclampd n,GLclampd f);

Преобразование координат: viewport void glViewport(GLint x,GLint y, GLsizei w,GLsizei h); w h void glDepthRange(GLclampd n,GLclampd f);

Слайд 26

Рисуем куб

x

y

z

Видимые грани:

7-6-5-4
6-7-3-2
7-5-1-3

Невидимые грани:

4-0-1-5
4-6-2-0
0-2-3-1

Рисуем куб x y z Видимые грани: 7-6-5-4 6-7-3-2 7-5-1-3 Невидимые грани: 4-0-1-5 4-6-2-0 0-2-3-1

Слайд 27

Команды OpenGL

glVertex3fv ( v )

2 – (x, y) 3 – (x, y, z) 4

Команды OpenGL glVertex3fv ( v ) 2 – (x, y) 3 –
– (x, y, z, w)

Число компонент

B – byte ub – unsigned byte s – short us – unsigned short I – int ui – unsigned int f – float d – double

Тип данных

«v» отсутствует для скалярных форм. Пример:
glVertex2f(x,y)

Вектор

Слайд 28

Модель begin/end

void glMatrixMode(…);
void glLoadIdentity();
void glMultMatrixd(…);

void glBegin(GLenum type);

void glVertex(…);
void glNormal(…);
void glColor(…);

void glEnd();

T&L

Rasterization

Pixel Ops

void

Модель begin/end void glMatrixMode(…); void glLoadIdentity(); void glMultMatrixd(…); void glBegin(GLenum type); void
glTexture2d(…);
void glTexEnv(…);
void glPolygonMode(…);

void glDepthFunc(…);
void glBlendFunc(…);
void glStencilOp(…);

Слайд 29

Формирование граней из вершин

1

0

2

3

4

5

GL_TRIANGLES:

0

1

3

2

4

5

7

6

GL_QUADS:

GL_POLYGON:

0

1

3

2

5

4

6

7

Формирование граней из вершин 1 0 2 3 4 5 GL_TRIANGLES: 0

Слайд 30

Однородные координаты

Общее аффинное преобразование сводится к умножению на матрицу

Проецирование также

Однородные координаты Общее аффинное преобразование сводится к умножению на матрицу Проецирование также
сводится к умножению на матрицу

Слайд 31

Преобразование координат

Отсечение:

Viewport

Vi={Ps,RGBA,…}

Преобразование координат Отсечение: Viewport Vi={Ps,RGBA,…}

Слайд 32

Матрицы преобразований

void glMatrixMode(Glenum mode);
mode={GL_MODELVIEW|GL_PROJECTION}

void glLoadIdentity();

void glMultMatrixd(GLdouble c[16]);

Выбираем матрицу преобразований для

Матрицы преобразований void glMatrixMode(Glenum mode); mode={GL_MODELVIEW|GL_PROJECTION} void glLoadIdentity(); void glMultMatrixd(GLdouble c[16]); Выбираем
изменения:

Две основные операции над матрицами:

Слайд 33

Матрицы преобразований. Продолжение

void glTranslated(GLdouble x,
GLdouble y,
GLdouble z);

void glScaled(GLdouble x,
GLdouble

Матрицы преобразований. Продолжение void glTranslated(GLdouble x, GLdouble y, GLdouble z); void glScaled(GLdouble
y,
GLdouble z);

void glRotated(GLdouble angle,
GLdouble ax,
GLdouble ay,
GLdouble az);

void gluPerspective(GLdouble fov,
GLdouble aspect,
GLdouble znear,
GLdouble zfar);

Слайд 34

Как работает gluPerspective?

X

Y

Z

0

O1

O2

A1

B1

C1

D1

A2

B2

C2

D2

void gluPerspective(GLdouble fov,
GLdouble aspect,
GLdouble znear,
GLdouble zfar);

fov =

Как работает gluPerspective? X Y Z 0 O1 O2 A1 B1 C1
D1OA1 (в градусах)
aspect = C1D1/D1A1
znear = |OO1|
zfar = |OO2|

Слайд 35

gluPerspective: продолжение

gluPerspective: продолжение

Слайд 36

Уменьшение количества вершин

1

0

2

3

4

5

GL_TRIANGLE_FAN: 3n vs. 1+n, n>1

1

0

2

3

4

5

6

7

GL_TRIANGLE_STRIP: 3n vs. 2+n

Уменьшение количества вершин 1 0 2 3 4 5 GL_TRIANGLE_FAN: 3n vs.
GL_QUAD_STRIP: 4n vs. 2+2n

1

0

3

2

5

4

6

7

Слайд 37

Виртуальная камера

gluLookAt( eyex, eyey, eyez, aimx, aimy, aimz, upx, upy, upz)

Виртуальная камера gluLookAt( eyex, eyey, eyez, aimx, aimy, aimz, upx, upy, upz)
Настройка виртуальной камеры

eye – координаты наблюдателя

aim – координаты “цели”

up – направление вверх

(upx, upy, upz)

(aimx, aimy, aimz)

( eyex, eyey, eyez)

Слайд 38

Лицевые и нелицевые грани

void glFrontFace(GLenum type);
type = {GL_CW|GL_CCW}

void glCullFace(GLenum type);
type

Лицевые и нелицевые грани void glFrontFace(GLenum type); type = {GL_CW|GL_CCW} void glCullFace(GLenum
= {GL_FRONT|GL_BACK (по умолчанию)}

glEnable(GL_CULL_FACE); glDisable(GL_CULL_FACE);

x

y

z

A1

A2

A3

A1

A3

A2

e2

e1

e2

e1

Слайд 39

Дисплейные списки

GLuint n = glGenLists(1);

glNewList(n,GL_COMPILE);
<…вызовы функции OpenGL…>
glEndList();

Дисплейный список (display list)

Дисплейные списки GLuint n = glGenLists(1); glNewList(n,GL_COMPILE); glEndList(); Дисплейный список (display list)
– запомненная последовательность команд OpenGL.

Находим неиспользуемый номер дисплейного списка

Сохраняем последовательность команд

Освобождаем номер дисплейного списка

glCallList(n);

Воспроизводим сохраненную последовательность команд (с теми же самыми параметрами!)

glDeleteLists(n,1);

Слайд 40

Z-буфер

Необходимо создать z-буфер

glutDisplayMode(GLUT_DEPTH|/*…*/);

Перед рисованием сцены очистить z-буфер

glClear(GL_DEPTH_BUFFER_BIT|/*…*/);

Включить или выключить

Z-буфер Необходимо создать z-буфер glutDisplayMode(GLUT_DEPTH|/*…*/); Перед рисованием сцены очистить z-буфер glClear(GL_DEPTH_BUFFER_BIT|/*…*/); Включить
сравнение z координат

glEnable(GL_DEPTH_TEST);

glDisable(GL_DEPTH_TEST);

Возможно задать операцию сравнения

glDepthFunc(GLenum type);
type = {GL_ALWAYS|GL_NEVER|GL_LESS|GL_GREATER|
GL_EQUAL|GL_NOTEQUAL|GL_LEQUAL|GL_GEQUAL}

Возможно включить или выключить запись в z-буфер

glDepthMask(TRUE); или glDepthMask(FALSE);

Слайд 41

Стек матриц

glLoadIdentity();
glTranslated(…);
glPushMatrix();
glRotated(…);
glPopMatrix();
glPushMatrix();
glRotataed(…);
glPopMatrix();

E

T

T

T*R1

T

T*R2

T

Стек матриц glLoadIdentity(); glTranslated(…); glPushMatrix(); glRotated(…); glPopMatrix(); glPushMatrix(); glRotataed(…); glPopMatrix(); E T

Слайд 42

Рисуем тор

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

Слайд 43

Уравнение освещенности по Фонгу

l

n

r

P’

e

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

Уравнение освещенности по Фонгу l n r P’ e Фоновое освещение не
от сцены

При диффузном освещении свет от источника равномерно рассеивается во всех направлениях.

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

Слайд 44

Модели Блинна и Шлика

Вычисление отраженного вектора – трудоемкая операция (Блинн)

Возведение

Модели Блинна и Шлика Вычисление отраженного вектора – трудоемкая операция (Блинн) Возведение
в степень также работает не очень быстро... (Шлик)

l

n

r

P’

e

Слайд 45

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

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

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

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

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

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

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

-l

vi

P’

Слайд 46

Установка параметров освещения в 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

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

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

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

Слайд 47

Установка параметров освещения. Часть 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 - закраска по Гуро

Слайд 48

Интерполяция цвета

Вычислить цвет (RGB) в каждой вершине.
Вычислить цвет в точках P1 и

Интерполяция цвета Вычислить цвет (RGB) в каждой вершине. Вычислить цвет в точках
P2: s = ||P1 - B|| / ||A - B|| C(P1) = s(C(A)) - (1-s)(C(B))
Вычислить цвет в т. Р: s = ||P - P2|| / ||P1 - P2|| C(P) = s(C(P1))-(1-s)(C(P2))

Слайд 49

Недостатки закраски по Гуро

Недостатки закраски по Гуро

Слайд 50

Интерполяция нормали

Вычислить нормали (RGB) в каждой вершине.
Вычислить нормаль в точках P1 и

Интерполяция нормали Вычислить нормали (RGB) в каждой вершине. Вычислить нормаль в точках
P2: s = ||P1 - B|| / ||A - B|| N(P1) = s(N(A)) + (1-s)(N(B))
Вычислить нормаль в т. Р: s = ||P - P2|| / ||P1 - P2|| N(P) = s(т(P1))-(1-s)(N(P2))
Вычислить цвет в точке Р.

Слайд 51

Массивы вершин

void glVertexPointer(GLint size,GLenum type,
GLsizei stride,const GLvoid *pointer;

Задаем массив вершин,

Массивы вершин void glVertexPointer(GLint size,GLenum type, GLsizei stride,const GLvoid *pointer; Задаем массив
нормалей и текстурных координат:

Задаем последовательность номеров вершин

void glDrawElements(GLenum mode,GLsizei count,
GLenum type, const GLvoid *indices);

Возможно полностью избежать дублирования вершин

Слайд 52

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

V1

V2

V3

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

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

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

Слайд 53

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 Ошибки линейной интерполяции Освещенность
лучше задавать в виде текстуры!

Слайд 54

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

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

Слайд 55

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

GLuint texture;
glGenTextures(1,&texture);

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

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

RGBNM


RGB1M

RGB0M





RGBN1


RGB11

RGB01

RGBN0


RGB10

RGB00

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

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

glBindTexture(texture);

Слайд 56

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

Слайд 57

Текстурирование в OpenGL: часть 3

Разрешаем текстурирования

Задаем текстурные координаты (обычно для

Текстурирование в OpenGL: часть 3 Разрешаем текстурирования Задаем текстурные координаты (обычно для
каждой вершины)

glEnable(GL_TEXTURE_2D);

glTexCoord2d(u,v);

Возможно, потребуется включить режим перспективного текстурирования

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);

Возвращаем номер текстурного объекта в список свободных

glDeleteTextures(1,&texture);

Слайд 58

Как загрузить картинку из файла?

Воспользоваться любой другой сторонней библиотекой

Функции

Как загрузить картинку из файла? Воспользоваться любой другой сторонней библиотекой Функции BmpLoad
BmpLoad из примеров:

Классы из NV SDK:

unsigned char *LoadIndexedBMPFile
(const char *path,int *width,int *height);
unsigned char *LoadTrueColorBMPFile
(const char *path,int *width,int *height);

namespace jpeg
{
extern int read(const char *filename,
int *width,int *height,
unsigned char **pixels, int *components);
}

Слайд 59

Фильтрация текстур

Выборка ближайшего текселя GL_NEAREST:

Линейная комбинация 4-x соседних пикселей GL_LINEAR:

Фильтрация текстур Выборка ближайшего текселя GL_NEAREST: Линейная комбинация 4-x соседних пикселей GL_LINEAR:

Слайд 60

Свертка текстурных координат

glTexParameteri(…,GL_REPEAT);
glTexParameteri(…,GL_REPEAT);

glTexParameteri(…,GL_CLAMP);
glTexParameteri(…,GL_REPEAT);

glTexParameteri(…,GL_REPEAT);
glTexParameteri(…,GL_CLAMP);

glTexParameteri(…,GL_CLAMP);
glTexParameteri(…,GL_CLAMP);

Свертка текстурных координат glTexParameteri(…,GL_REPEAT); glTexParameteri(…,GL_REPEAT); glTexParameteri(…,GL_CLAMP); glTexParameteri(…,GL_REPEAT); glTexParameteri(…,GL_REPEAT); glTexParameteri(…,GL_CLAMP); glTexParameteri(…,GL_CLAMP); glTexParameteri(…,GL_CLAMP);

Слайд 61

Фильтрация текстур: mipmapping

увеличение текстуры

масштаб 1:1

уменьшение текстуры

увеличение текстуры

масштаб 1:1

уменьшение текстуры в 2λ раз

Фильтрация текстур: mipmapping увеличение текстуры масштаб 1:1 уменьшение текстуры увеличение текстуры масштаб

Слайд 62

Фильтрация текстур: mipmapping. Часть 2

256x256, λ=0

64x64, λ=2

16x16, λ=4

Трилинейная фильтрация GL_LINEAR_MIPMAP_LINEAR

Фильтрация текстур: mipmapping. Часть 2 256x256, λ=0 64x64, λ=2 16x16, λ=4 Трилинейная фильтрация GL_LINEAR_MIPMAP_LINEAR

Слайд 63

Анизотропная фильтрация

Экран

Расширение “GL_EXT_texture_filter_anisotropic”

Анизотропная фильтрация Экран Расширение “GL_EXT_texture_filter_anisotropic”

Слайд 64

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

RGBAf из модуля T&L

RGBAt текстуры

RGBAс результат

+

=

Модулирование GL_MODULATE (по умолчанию)

Текстура и освещение RGBAf из модуля T&L RGBAt текстуры RGBAс результат +
Смешение GL_DECAL,GL_BLEND

Замещение GL_REPLACE

Demo

Слайд 65

Генерация текстурных координат

Линейная зависимость

Environment mapping - эффект отражающей поверхности

r

n

h

P’

(u,v)

Генерация текстурных координат Линейная зависимость Environment mapping - эффект отражающей поверхности r n h P’ (u,v)

Слайд 66

Генерация текстурных координат. Продолжение

Включаем автоматическую генерацию текстурных координат (для первыхдвух координат)

glEnable(GL_TEX_GEN_S);
glEnable(GL_TEX_GEN_T);

Генерация текстурных координат. Продолжение Включаем автоматическую генерацию текстурных координат (для первыхдвух координат)
Включаем автоматическую генерацию текстурных координат (для первых двух координат)

glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);
glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);

Слайд 67

Использование текстуры как фонового изображения

Устанавливаем ортогональную проекцию

glMatrixMode(GL_PROJECTION);
glLoadIndentity();
glOrtho(-1,1,-1,1,-1,1);

Устанавливаем ортогональную проекцию

glMatrixMode(GL_MODELVIEW);
glLoadIndentity();

Рисуем

Использование текстуры как фонового изображения Устанавливаем ортогональную проекцию glMatrixMode(GL_PROJECTION); glLoadIndentity(); glOrtho(-1,1,-1,1,-1,1); Устанавливаем
прямоугольник

glEnable(GL_TEXTURE_2D);
glBindTexture(bktex);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex2f(-1,-1);
glTexCoord2f(1,0); glVertex2f(1,-1);
glTexCoord2f(1,1); glVertex2f(1,1);
glTexCoord2f(0,1); glVertex2f(-1,1);
glEnd();

Слайд 68

Преобразование текстурных координат

Работаем с матрицей T точно также как с M

Преобразование текстурных координат Работаем с матрицей T точно также как с M
и P.

glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMultMatrix(…);

Позволяет существенно изменять вид объекта не изменяя геометрии

Слайд 69

Пиксельные операции

T&L

Rasterization

Pixel Ops

Буфер кадра

Буфер глубины

Буфер трафарета

Буфер аккумулятора

Пиксельные операции T&L Rasterization Pixel Ops Буфер кадра Буфер глубины Буфер трафарета Буфер аккумулятора

Слайд 70

Пиксельные операции. Продолжение.

Scissor test

Alpha test

Stencil test

Depth test

Blending

Stencil Buffer:
Sij

Z Buffer:
Zij

Frame buffer:
RGBAij

Пиксельные операции. Продолжение. Scissor test Alpha test Stencil test Depth test Blending

Слайд 71

Scissor & Alpha test

Не записывать пиксел

Не записывать пиксел

Нет

Нет

Да

Да

glScissor(x,y,w,h);
glEnable(GL_SCISSOR_TEST);
glDisable(GL_SCISSOR_TEST);

glEnable(GL_SCISSOR_TEST);
glDisable(GL_SCISSOR_TEST);
glAlphaFunc(GL_GREATER,0.5);

Scissor & Alpha test Не записывать пиксел Не записывать пиксел Нет Нет

Слайд 72

Смешение цветов

glEnable(GL_BLEND);
glDisable(GL_BLEND);
glBlendFunc(sfactor,dfactor)

Команды OpenGL:

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA):

glBlendFunc(GL_ONE_MINUS_SRC_ALPHA,GL_SRC_ALPHA):

glBlendFunc(GL_ZERO,GL_SRC_COLOR):

Смешение цветов glEnable(GL_BLEND); glDisable(GL_BLEND); glBlendFunc(sfactor,dfactor) Команды OpenGL: glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA): glBlendFunc(GL_ONE_MINUS_SRC_ALPHA,GL_SRC_ALPHA): glBlendFunc(GL_ZERO,GL_SRC_COLOR):

Слайд 73

Карты освещенности (lightmaps)

(i,j)

Карта освещенности:

Мультитекстурирование:

Экономия количества примитивов при динамическом освещении

Экономия

Карты освещенности (lightmaps) (i,j) Карта освещенности: Мультитекстурирование: Экономия количества примитивов при динамическом
текстур при статическом освещении

Возможен предварительный расчет освещения

Слайд 74

Смещение вершин

При использовании буфера глубины могут возникнуть проблемы с рисование

Смещение вершин При использовании буфера глубины могут возникнуть проблемы с рисование граней,
граней, лежащих в одной плоскости.

Z

Y

Возможно задать смещение глубины для каждой вершины

void glPolygonOffset(GLfloat factor,
GLfloat units);

Слайд 75

Мультитекстурирование

F(RGBAc,RGBA0)

RGBA0

Texture 0

Lighting

RGBAc

RGBA1

Texture 1

RGBAf

F(RGBAf,RGBA1)

Объединение текстуры объекта и текстуры среды

Мультитекстурирование F(RGBAc,RGBA0) RGBA0 Texture 0 Lighting RGBAc RGBA1 Texture 1 RGBAf F(RGBAf,RGBA1)

Слайд 76

Расширения OpenGL

Читаем спецификацию расширения (ARB_multitexture)

Определяем константы


#define GL_TEXTURE0_ARB 0x84C0
#define

Расширения OpenGL Читаем спецификацию расширения (ARB_multitexture) Определяем константы … #define GL_TEXTURE0_ARB 0x84C0
GL_TEXTURE1_ARB 0x84C1
#define GL_TEXTURE2_ARB 0x84C2
#define GL_TEXTURE3_ARB 0x84C3

Определяем указатели на функции


void (APIENTRY * glMultiTexCoord2d)(GLenum target,
GLdouble s,
GLdouble t);
void (APIENTRY * glActiveTexture)(GLenum target);

Слайд 77

Расширения OpenGL. Продолжение

Получаем список доступных расширений

char *extensions = glGetString(GL_EXTENSIONS);

Расширения OpenGL. Продолжение Получаем список доступных расширений char *extensions = glGetString(GL_EXTENSIONS);

Слайд 78

Расширения OpenGL. Часть 3.

Получаем указатели на функции


glActiveTexture = wglGetProcAddress("glActiveTextureARB");
glMultiTexCoord2d

Расширения OpenGL. Часть 3. Получаем указатели на функции … glActiveTexture = wglGetProcAddress("glActiveTextureARB");
= wglGetProcAddress("glMultiTexCoord2dARB");

Задаем текстурные объекты для каждого текстурного блока


(*glActiveTexture)(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(…);

(*glActiveTexture)(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(…);

Слайд 79

Расширения OpenGL. Часть 4.

Задаем смешение цвета освещения и цвета первой текстуры


(*glActiveTexture)(GL_TEXTURE0_ARB);
glTexEnvi(…);

Задаем

Расширения OpenGL. Часть 4. Задаем смешение цвета освещения и цвета первой текстуры
текстурные координаты для каждого текстурного блока


(*glMultiTexCoord2d)(GL_TEXTURE0_ARB,0.5,0.5);
(*glMultiTexCoord2d)(GL_TEXTURE1_ARB,0.2,0.3);

Задаем смешение цвета первого блока и второй текстуры


(*glActiveTexture)(GL_TEXTURE1_ARB);
glTexEnvi(…);

Слайд 80

Полупрозрачные объекты

Полупрозрачная грань - грань через часть пикселов которой видно лежащие

Полупрозрачные объекты Полупрозрачная грань - грань через часть пикселов которой видно лежащие
за ней грани.

Полупрозрачные грани необходимо выводить в порядке back-to-front. Применение метода Z-буфера ведет к визуальным артефактам -“глюкам” :)

Для выпуклых объектов можно выводить сначала нелицевые грани, а затем - лицевые.

Объекты можно выводить методом художника - сортировать по убыванию координат Z центров.

Слайд 81

Буфер трафарета и буфер глубины

RGBAx,y=F(RGBAx,y,RGBAf)

Изменение Sx,y

Изменение Sx,y

Изменение Sx,y

Да

Да

Нет

Нет

Не записывать пиксел

Не записывать пиксел

void

Буфер трафарета и буфер глубины RGBAx,y=F(RGBAx,y,RGBAf) Изменение Sx,y Изменение Sx,y Изменение Sx,y
glStencilOp(GLenum failOp,
GLenum zfailOp,
GLenum zpassOp);

failOp:

zfailOp:

zpassOp:

void glStencilFunc(GLenum func,
GLint ref,
GLuint mask);

func:

Слайд 82

Буфер трафарета: видимость пикселей

true

Sx,y=1 для грани F

-

Запись пикселя

Да

Да

Нет

F

F

Sx,y== 1

Sx,y== 0

glStencilFunc(GL_KEEP,
GL_KEEP,
GL_REPLACE);

Буфер трафарета: видимость пикселей true Sx,y=1 для грани F - Запись пикселя

glStencilOp(GL_ALWAYS,
1,1);

Слайд 83

Буфер трафарета: обработка пикселей

Sx,y==1?

-

-

Запись пикселя

Да

Да

Нет

-

Нет

F

F

Sx,y== 1

Sx,y== 0

glStencilOp(GL_EQUAL,
1,1);

glStencilFunc(GL_KEEP,
GL_KEEP,
GL_KEEP);

Буфер трафарета: обработка пикселей Sx,y==1? - - Запись пикселя Да Да Нет

Слайд 84

Буфер трафарета: тени и отражения

Отбрасывание тени на плоскую грань

Правильно

Неправильно

Отражения и

Буфер трафарета: тени и отражения Отбрасывание тени на плоскую грань Правильно Неправильно Отражения и порталы
порталы

Слайд 85

Буфер трафарета: теневые объемы

Строим теневой объем

Рисуем затеняемый объект со включенным

Буфер трафарета: теневые объемы Строим теневой объем Рисуем затеняемый объект со включенным
Z-буфером

Z

Y


glEnable(GL_DEPTH_TEST);
glCallList(object);

Слайд 86

Теневые объемы. Продолжение.

Рисуем нелицевые грани теневого объема

Z

Y


glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS,1,1);
glStencilOp(GL_KEEP,
GL_KEEP,
GL_REPLACE);
glColorMask(0,0,0,0);
glDepthMask(0);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glCallList(shadow);

Теневые объемы. Продолжение. Рисуем нелицевые грани теневого объема Z Y … glEnable(GL_STENCIL_TEST);

Слайд 87

Теневые объемы. Часть 3.

Рисуем лицевые грани теневого объема

Z

Y


glStencilFunc(GL_ALWAYS,1,1);
glStencilOp(GL_KEEP,
GL_KEEP,
GL_INVERT);
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
glCallList(shadow);
glColorMask(1,1,1,1);
glDepthMask(1);

Теневые объемы. Часть 3. Рисуем лицевые грани теневого объема Z Y …

Слайд 88

Теневые объемы. Часть 4.

Возможен вывод граней теневого объема в произвольном порядке.

Теневые объемы. Часть 4. Возможен вывод граней теневого объема в произвольном порядке.

Z

Y


glStencilFunc(GL_ALWAYS,1,1);
glStencilOp(GL_KEEP,
GL_KEEP,
GL_INVERT);
glDisable(GL_CULL_FACE);
glColorMask(0,0,0,0);
glDepthMask(0);
glCallList(shadow);
glColorMask(1,1,1,1);
glDepthMask(1);

Слайд 89

Теневые объемы. Часть 5.

Рисуем затененную часть объекта

Z

Y


glStencilFunc(GL_EQUAL,1,1);
glStencilOp(GL_KEEP,
GL_KEEP,
GL_KEEP);

glCallList(object);

glDisable(GL_STENCIL_TEST);
……

Теневые объемы. Часть 5. Рисуем затененную часть объекта Z Y … glStencilFunc(GL_EQUAL,1,1);

Слайд 90

Кубические карты: определение.

V

t

R

Точка R = R(t), t = (p,q,r) определяет одну

Кубические карты: определение. V t R Точка R = R(t), t =
из шести текстур и текстурные координаты. (p,q,r)->RGBA

Расширение “GL_EXT_cube_map”

C вершиной V связано три текстурные координаты (p,q,r).

x

y

z

Слайд 91

Кубические карты среды.

n

P’

е

r

R

Необходимо применить к текстурным координатам преобразование, обратное модельно-видовому!

x

y

z

Кубические карты среды. n P’ е r R Необходимо применить к текстурным

Слайд 92

Кубические карты освещения.

t

P’

Пусть источники освещения находятся далеко от объекта. Тогда освещение

Кубические карты освещения. t P’ Пусть источники освещения находятся далеко от объекта.
в точке объекта зависит только от нормали.

x

y

z

Заранее запишем результат расчета освещенности для нормали n в элемент кубической текстуры с координатами n.

Слайд 93

Построение отражающего объекта.

O

Переносим наблюдателя в центр отражающего объекта и строим изображение,

Построение отражающего объекта. O Переносим наблюдателя в центр отражающего объекта и строим
полученное при взгляде в направлении нормали к одной из сторон.

Сохраняем изображение на экране как текстуру!

void glCopyTexImage2D(
GLenum target, GLint level,
GLenum internalFormat,
GLint x, GLint y, Glsizei width, GLsizei height,
GLint border );

Рисуем объект с кубическими картами отражения.

Имя файла: Современные-графические-технологии.pptx
Количество просмотров: 109
Количество скачиваний: 0