(работа с текстурами)
Определения
Уровни детализации
Порядок задания
Пример задания текстурных координат
Пример кода для задания квадрата с текстурой из файла «texture.bmp»
Пример задания зеркальной текстуры
Загрузка текстуры: библиотека GLAUX
Загрузка текстуры: библиотека FreeImage http://freeimage.sourceforge.net
Загрузка текстуры: WinAPI
Загрузка текстуры: библиотека C++
Влияние координат 1 glTexCoord2f(*)
Влияние координат 2 glTexCoord2f(*)
Влияние координат 3 glTexCoord2f(*)
Влияние формы
Влияние растяжения glTexParameteri ( *, GL_TEXTURE_MIN_FILTER, ? )
Влияние замощения glTexParameteri( *, GL_TEXTURE_WRAP_S, ? )
Влияние текстуры на цвет примитива glTexEnvf( *, GL_TEXTURE_ENV_MODE, GL_REPLACE )
Влияние текстуры на цвет примитива glTexEnvf( *, GL_TEXTURE_ENV_MODE, ? )
Влияние логических операций
Смешивание текстур glTexEnvf( *, GL_TEXTURE_ENV_MODE, *)
Влияние ошибки RGB/BGR gluBuild2DMipmaps ( *,*,*,*, ?, *,* )
Нанесение текстур на сложные объекты: 1) равносторонний треугольник
Нанесение текстур на сложные объекты: 2) состыкованные равносторонние треугольники
Нанесение текстур на сложные объекты: 3) единичный куб (боковая поверхность)
Нанесение текстур на сложные объекты: 4) единичный цилиндр (боковая поверхность)
Нанесение текстур на сложные объекты 5) единичный круг с центром в (0.5,0.5)
Варианты отображения примитива QUAD 1) шаблон контура
Варианты отображения примитива QUAD 2) шаблон заливки
Варианты отображения примитива QUAD 3) текстура+шаблон
Варианты отображения примитивов из библиотеки GLU
Варианты отображения примитивов из библиотеки GLU
Варианты отображения примитивов из библиотеки GLUT
1.51M

Часть 3-2 (Текстуры)

1. (работа с текстурами)

Часть 3-2
(работа с текстурами)

2. Определения

Текстура – это графическое изображение,
используемое для нанесения изображения на объект,
составленный из множества примитивов
Обычно текстура задается в виде двумерной картинки
в формате несжатого bmp с разрешением, кратным 2
Цель применения текстур – повышение реалистичности изображения
за счет экономии вычислительных ресурсов
Тексель (texel – texture element) – это элемент (пиксель) текстуры
c координатами (s,t)
В общем случае тексель не обязательно является пикселем изображения
2 (33)
3.2.1 Определения [1/2]

3. Уровни детализации

256х256
Уровень
Разрешение
0
(width) x (height)
1
( width / 2 ) x ( height / 2 )
2
( width / 4 ) x ( height / 4 )
3
( width / 8 ) x ( height / 8 )

k
128х128

(1)x(1)
если width==height
64х64
32х32
3 (33)
3.2.1 Определения [2/2]

4. Порядок задания

1. Загрузка
графических файлов
2. Создание
списка номеров текстур
glGenTextures
3. Выбор
активной (текущей) текстуры
glBindTexture
4. Построение
уровней детализации
gluBuild2DMipmaps
glTexImage2D+gluScaleImage
5. Указание
параметров растяжения
glTexParameter
6. Определение
взаимодействия с цветом
glTexEnv
7. Задание
текстурных координат
glTexCoord
glTexGen
8. Разрешение
использования текстуры
4 (33)
LoadImage,
fread, …
3.2.2 Задание текстуры
glEnable(GL_TEXTURE_2D)

5. Пример задания текстурных координат

Y
y1
T
1
y0
x0
0
0
5 (33)
1
S
3.2.3 Пример задания текстур [1/3]
x1
X

6. Пример кода для задания квадрата с текстурой из файла «texture.bmp»

int width, height // разрешение текстуры (ширина и высота)
unsigned char *pixels; // массив пикселей текстуры
if( !LoadTextureFromFile ( «texture.bmp», width, height,
type, pixels ) ) return;
glGenTextures ( 1, &tex );
glBindTexture ( GL_TEXTURE_2D, tex );
gluBuild2DMipmaps ( GL_TEXTURE_2D, 3, width, height,
GL_RGB, GL_UNSIGNED_BYTE, pixels );
glTexEnvi ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
glEnable ( GL_TEXTURE_2D );
glBegin ( GL_QUAD );
glTexCoord2f(0,0); glVertex2i(10,10);
glTexCoord2f(0,1); glVertex2i(10,90);
glTexCoord2f(1,1); glVertex2i(90,90);
glTexCoord2f(1,0); glVertex2i(90,10);
glEnd();
6 (33)
3.2.3 Пример задания текстур [2/3]

7. Пример задания зеркальной текстуры

GLfloat s_koef[] = { 1, 0, 0, 1 };
GLfloat t_koef[] = { 0, 1 ,0, 1 };
glEnable ( GL_TEXTURE_GEN_S );
glTexGeni ( GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGenfv ( GL_S, GL_EYE_PLANE, s_koef);
glEnable ( GL_TEXTURE_GEN_T );
glTexGeni ( GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGenfv ( GL_T, GL_EYE_PLANE, t_koef);
7 (33)
3.2.3 Пример задания текстур [3/3]

8. Загрузка текстуры: библиотека GLAUX

bool LoadTextureFromFile ( char* FileName,
int &Width, int &Height,
Ограничение:
GLenum &Type,
файл должен быть BMP
unsigned char *Pixels )
{
AUX_RGBImageRec *bmp = auxDIBImageLoad (FileName );
if ( !bmp ) return (false);
Width = bmp ->sizeX;
Height = bmp ->sizeY;
Pixels = bmp ->data;
Type = GL_RGB;
return (true);
}
8 (33)
3.2.4 Пример загрузки текстур [1/4]

9. Загрузка текстуры: библиотека FreeImage http://freeimage.sourceforge.net

bool LoadTextureFromFile ( char* FileName,
int &Width, int &Height,
GLenum &Type,
unsigned char *Pixels )
{
FREE_IMAGE_FORMAT format = FreeImage_GetFileType ( FileName, 0 );
FIBITMAP *bmp = FreeImage_Load ( format, FileName );
if ( !bmp ) return (false);
bmp = FreeImage_ConvertToStandardType ( bmp );
Width = FreeImage_GetWidth ( bmp );
Height = FreeImage_GetHeight ( bmp );
Pixels = FreeImage_GetBits
( bmp );
Type = GL_RGB ;
return (true);
}
9 (33)
3.2.4 Пример загрузки текстур [2/4]

10. Загрузка текстуры: WinAPI

bool LoadTextureFromFile ( char* FileName,
int &Width, int &Height,
Ограничение:
GLenum &Type,
файл должен быть BMP
unsigned char *Pixels )
{
HBITMAP hbmp = (HBITMAP) LoadImage ( NULL, FileName, IMAGE_BITMAP, 0,
0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
if ( !hbmp ) return (false) ;
BITMAP bmp ; GetObject ( hbmp, sizeof(bmp), &bmp) ;
if ( !bmp ) return (false) ;
Width = bmp.bmWidth;
Height = bmp.bmHeight;
Pixels = bmp.bmBits;
Type = GL_BGR_EXT ;
return (true);
}
10 (33)
3.2.4 Пример загрузки текстур [3/4]

11. Загрузка текстуры: библиотека C++

bool LoadTextureFromFile ( char* FileName,
int &Width, int &Height,
Ограничение:
GLenum &Type,
файл должен быть несжатым BMP 24b
unsigned char *Pixels )
{
unsigned char data54 [54]; // служебный заголовок 54 байта
FILE *file = fopen(FileName,"rb”); if(!file) return(false);
int err = fread(data54,1,54,file); if(err != 1) return(false);
int size =
Width
=
Height
=
*( data54 + 10 ); if (size != 54) return(false);
*( data54 + 18 );
*( data54 + 22 );
Pixels = new unsigned char [ Width * Height * 3 ];
err = fread(Pixels,size,1,file); if(err != size) return (false);
fclose(file);
Type = GL_BGR_EXT;
return (true);
}
11 (33)
3.2.4 Пример загрузки текстур [4/4]

12. Влияние координат 1 glTexCoord2f(*)

12 (33)
3.2.5 Влияние текстурных параметров [1/11]

13. Влияние координат 2 glTexCoord2f(*)

13 (33)
3.2.5 Влияние текстурных параметров [2/11]

14. Влияние координат 3 glTexCoord2f(*)

14 (33)
3.2.5 Влияние текстурных параметров [3/11]

15. Влияние формы

15 (33)
3.2.5 Влияние текстурных параметров [4/11]

16. Влияние растяжения glTexParameteri ( *, GL_TEXTURE_MIN_FILTER, ? )

GL_NEAREST
(растяжение по 1 ближайшей точке)
16 (33)
GL_LINEAR
(растяжение по 4 соседним точкам)
3.2.5 Влияние текстурных параметров [5/11]

17. Влияние замощения glTexParameteri( *, GL_TEXTURE_WRAP_S, ? )

glTexCoord2f (1,1) → glTexCoord2f (2,1)
GL_REPEAT
(дублирование)
17 (33)
GL_CLAMP
(отсечение)
3.2.5 Влияние текстурных параметров [6/11]

18. Влияние текстуры на цвет примитива glTexEnvf( *, GL_TEXTURE_ENV_MODE, GL_REPLACE )

Объекты
без
текстуры
Запрет влияния
воздействия текстуры
на второй объект
glEnable + glDisable
Влияние
воздействия
текстуры на
второй объект
(glEnable

glDisable)
18 (33)
3.2.5 Влияние текстурных параметров [7/11]

19. Влияние текстуры на цвет примитива glTexEnvf( *, GL_TEXTURE_ENV_MODE, ? )

Объекты
без
текстуры
GL_MODULATE
19 (33)
GL_BLEND
3.2.5 Влияние текстурных параметров [8/11]

20. Влияние логических операций

glEnable ( GL_COLOR_LOGIC_OP )
glLogicOp ( GL_AND )
glTexEnvf( *, GL_TEXTURE_ENV_MODE,
GL_MODULATE )
glEnable ( * )
glDisable ( * )
20 (33)
3.2.5 Влияние текстурных параметров [9/11]

21. Смешивание текстур glTexEnvf( *, GL_TEXTURE_ENV_MODE, *)

GL_REPLACE
GL_MODULATE )
21 (33)
3.2.5 Влияние текстурных параметров [10/11]

22. Влияние ошибки RGB/BGR gluBuild2DMipmaps ( *,*,*,*, ?, *,* )

В Windows порядок RGB изменен на BGR
GL_RGB
GL_BGR_EXT
22 (33)
3.2.5 Влияние текстурных параметров [11/11]

23. Нанесение текстур на сложные объекты: 1) равносторонний треугольник

Цель: наложить текстуру без искажений (с обрезкой)
(0.5, 0.9)
Текстура
(1, 0)
(0, 0)
Текстурные
координаты
Результат
Объект
23 (33)
3.2.6 Нанесение текстур на сложные объекты [1/5]

24. Нанесение текстур на сложные объекты: 2) состыкованные равносторонние треугольники

1. Текстура накладывается независимо
(0.3, 1)
2. Текстура обрезается
с растяжением по горизонтали
(1, 1) и сжатием по вертикали
Текстура
(0, 0)
24 (33)
(0.6, 0)
3.2.6 Нанесение текстур на сложные объекты [2/5]

25. Нанесение текстур на сложные объекты: 3) единичный куб (боковая поверхность)

Нанесение текстур на сложные объекты:
Цель
3) единичный куб (боковая поверхность)
Текстура
(0, 1)
(1/4, 1)
(0.5, 1)
(3/4, 1)
(1, 1)
(0, 0)
(1/4, 0)
(0.5, 0)
(3/4, 0)
(1, 0)
Развертка
боковой
поверхности:
высота = 1
ширина = 4
25 (33)
3.2.6 Нанесение текстур на сложные объекты [3/5]

26. Нанесение текстур на сложные объекты: 4) единичный цилиндр (боковая поверхность)

Нанесение текстур на сложные объекты:
Текстура
Объект
4) единичный цилиндр (боковая поверхность)
(0, 1)
(1, 1)
(0, 0)
(1, 0)
Развертка
боковой
поверхности:
высота = 1
ширина = 2*ПИ
26 (33)
3.2.6 Нанесение текстур на сложные объекты [4/5]

27. Нанесение текстур на сложные объекты 5) единичный круг с центром в (0.5,0.5)

(0.5, 1)
Координаты любой
точки окружности с
центром в (0.5,0.5):
(-c, s)
(c, s)
x 0.5 R cos( )
y 0.5 R sin( )
угол разбиения
(0, 0.5)
(1, 0.5)
R радиус круга
c cos( )
s sin( )
(-c, -s)
(c, -s)
(0.5, 0)
27 (33)
3.2.6 Нанесение текстур на сложные объекты [5/5]

28. Варианты отображения примитива QUAD 1) шаблон контура

glPointSize ( 10 )
glEnable ( GL_POINT_SMOOTH )
glPolygonMode ( GL_FRONT_AND_BACK, GL_POINT )
glLineWidth ( 2 )
glPolygonMode ( GL_FRONT_AND_BACK, GL_LINE )
glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL )
28 (33)
3.2.7 Варианты отображения примитива QUAD [1/3]

29. Варианты отображения примитива QUAD 2) шаблон заливки

glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL )
glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL )
glEnable (GL_FLAT)
glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL )
glEnable ( GL_POLYGON_STIPPLE )
glPolygonStipple ( maska )
29 (33)
3.2.7 Варианты отображения примитива QUAD [2/3]

30. Варианты отображения примитива QUAD 3) текстура+шаблон

glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL )
glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL )
glEnable ( GL_TEXTURE_2D )
glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL )
glEnable ( GL_POLYGON_STIPPLE )
glEnable ( GL_TEXTURE_2D )
glPolygonStipple ( maska )
30 (33)
3.2.7 Варианты отображения примитива QUAD [3/3]

31. Варианты отображения примитивов из библиотеки GLU

Стиль
gluSphere ( *,
100, 8,8 )
gluSphere ( *,
100, 16,16 )
glColor3ub ( 128, 0, 128 );
glPointSize( 4 );
glLineWidth( 2 );
GLU_FILL
GLUquadricObj *quadObj = gluNewQuadric();
gluQuadricTexture (quadObj, GL_TRUE);
gluQuadricDrawStyle (quadObj, GLU_FILL);
GLU_LINE
gluSphere (quadObj,100, 8,8);
gluDeleteQuadric (quadObj);
GLU_POINT
31 (33)
3.2.8 Варианты отображения примитивов из GLU и GLUT [1/3]

32. Варианты отображения примитивов из библиотеки GLU

Стиль
glColor3ub ( 128, 0, 128 );
gluSphere ( *,
100, 8,8 )
gluSphere ( *,
100, 16,16 )
glPointSize( 4 );
glLineWidth( 2 );
GLU_FILL
glEnable( GL_TEXTURE_2D );
GLUquadricObj *quadObj = gluNewQuadric();
gluQuadricTexture (quadObj, GL_TRUE);
gluQuadricDrawStyle (quadObj, GLU_FILL);
GLU_LINE
gluSphere ( quadObj, 100, 8,8 );
gluDeleteQuadric (quadObj);
GLU_POINT
32 (33)
3.2.8 Варианты отображения примитивов из GLU и GLUT [2/3]

33. Варианты отображения примитивов из библиотеки GLUT

Примитив
glColor3ub (128, 0, 128 );
glLineWidth ( 2 );
Сплошной
режим
Каркасный
режим
glutSolidTorus(
50,100,
8,8 )
glutWireTorus(
50,100,
8,8 )
glutSolidCube (150)
glutWireCube (150)
glutSolidTeapot (150)
glutWireTeapot (150)
33 (33)
3.2.8 Варианты отображения примитивов из GLU и GLUT [3/3]
English     Русский Rules