Часть 3-5.ppt
- Количество слайдов: 33
Интерактивная Компьютерная Графика Часть 3 -5 (текстуры)
Текстура ü Текстура – это графическое изображение используемая для нанесения изображения на объект, составленный из множества полигонов (примитивов) Обычно текстура задается в виде двумерной картинки в формате bmp ü Цель применения текстур – повышение реалистичности изображения за счет экономии вычислительных ресурсов ü Этапы наложения текстур: • • выбрать изображение в нужном формате загрузить изображение в память установить параметры учета текстур привязать текстуру к объекту
Текстурные координаты Y y 1 T 1 y 0 x 0 0 0 1 S x 1 X
Порядок задания текстуры Загрузка графического файла в память Load. Image (*) aux. DIBImage. Load (*) Создание списка номеров текстур gl. Gen. Textures (*) Выбор активной (текущей) текстуры gl. Bind. Texture (*) Построение уровней детализации Определение параметров растяжения Определение взаимодействия с материалом Задание текстурных координат glu. Build 2 DMipmaps (*) gl. Tex. Image 2 D gl. Tex. Parameter (*) gl. Tex. Env (*) gl. Tex. Coord (*) gl. Tex. Gen (*)
Функции задания текстуры /* Создание списка номеров текстур */ gl. Gen. Textures ( count, numbers ) // GLsizei count – число текстур // GLuint* numbers – массив номеров текстур /* Выбор активной (текущей) текстуры (через ее номер) */ gl. Bind. Texture ( type, number ) // GLenum type – тип текстуры ( GL_TEXTURE_1 D или GL_TEXTURE_2 D) // GLuint number – номер активной текстуры /* Построение уровней детализации */ glu. Build 2 DMipmaps ( GL_TEXTURE_2 D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels) // Lsizei width, height – ширина и высота текстуры // const GLvoid* pixels – массив пикселей текстуры
Функции задания текстуры /* Построение уровней детализации (альтернатива функции glu. Build 2 DMipmaps */ gl. Tex. Image 2 D ( GL_TEXTURE_2 D, level, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels ) // GLint level – уровень детализации для объектов на экране // Lsizei width, height – ширина и высота текстуры (кратна степени 2) // const GLvoid* pixels – массив пикселей текстуры Виды детализации (когда объект меньше размеров текстуры) : • 0 – исходное изображение: width * height • 1 – первый уровень: ( width / 2 ) * ( height / 2 ) • 2 – второй уровень: ( width / 4 ) * ( height / 4 ) • 3 – третий уровень: ( width / 8 ) * ( height / 8 ) …. • k – последний уровень: ( 1 ) * ( 1 ) , если width==height /* Выравнивание размера (по степеням 2) и типа текстуры */ void glu. Scale. Image ( GL_RGB, width 0, height 0, GL_UNSIGNED_BYTE, * pixels 0, GL_RGB, width 1, height 1, GL_UNSIGNED_BYTE, * pixels 1 )
Функции задания текстуры /* Определение параметров растяжения текстуры */ gl. Tex. Parameterf ( type, param, value ) // GLenum param – параметр // GLenum value – значение параметра // Растяжение/сжатие текстуры по линейному закону ( GL_LINEAR) // или по значению ближайшего пикселя ( GL_NEAREST ) gl. Tex. Parameterf ( GL_TEXTURE_2 D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ) gl. Tex. Parameterf ( GL_TEXTURE_2 D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ) // Дублирование текстуры (текстурные координаты должны быть больше 1) // или же единичное наложение (GL_CLAMP) gl. Tex. Parameterf ( GL_TEXTURE_2 D, GL_TEXTURE_WRAP_S, GL_ REPEAT ); gl. Tex. Parameterf ( GL_TEXTURE_2 D, GL_TEXTURE_WRAP_T, GL_CLAMP );
Функции задания текстуры /* Учет взаимодействия текстуры с материалом */ // Вариант, когда цвет рассчитывается через произведение цвета материала // на цвет текстуры (по умолчанию) gl. Tex. Env ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) // Вариант, когда цвет рассчитывается через сумму цветов материала и текстуры gl. Tex. Env ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND ) // Вариант, когда цвет материала игнорируется, т. е. используется только цвет текстуры gl. Tex. Env ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE )
Функции задания текстуры /* Текстурные координаты для активной вершины*/ void gl. Tex. Coord 2 f (float s, float t) /* Текстурные координаты для сложных примитивов из библиотеки GLU*/ void glu. Quadric. Texture ( GLUquadric. Obj* quad. Object, GL_TRUE) /* Текстурные координаты сразу для всех вершин, вычисляемые */ /* через расстояние до задаваемой плоскости*/ void gl. Tex. Geni ( GLenum coord, GLenum pname, GLtype value 1) void gl. Tex. Genfv ( GLenum coord, GLenum pname, GLtype* value 2) // coord – GL_S или GL_T // param – GL_TEXTURE_GEN_MODE, GL_OBJECT_PLANE, GL_EYE_PLANE // value 1 – GL_OBJECT_LINEAR, GL_EYE_LINEAR, GL_SPHERE_MAP // value 2 – 4 коэффициента из уравнения плоскости gl. Enable ( GL_TEXTURE_GEN_S ) gl. Enable ( GL_TEXTURE_GEN_T )
Пример задания зеркальной текстуры float s_koef[] = { 1, 0, 0, 1 } ; float t_koeff[] = { 0, 1 , 0, 1 }; gl. Enable ( GL_TEXTURE_GEN_S ); gl. Tex. Geni ( GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); gl. Tex. Genfv ( GL_S, GL_EYE_PLANE, s_koef); gl. Enable ( GL_TEXTURE_GEN_T ); gl. Tex. Geni ( GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); gl. Tex. Genfv ( GL_T, GL_EYE_PLANE, t_koef);
Пример задания текстуры int width ; // размер текстуры по OX (ширина) int height ; // размер текстуры по OY (высота) unsigned char pixels ; // массив пикселей текстуры GLenum type ; // RGB-формат хранения текстуры GLuint tex ; // идентификатор данной текстуры if( !Load. Texture. From. File ( “texture. bmp“, width, height, type, pixels ) ) return ; gl. Gen. Textures ( 1, &tex) ; gl. Bind. Texture ( GL_TEXTURE_2 D, tex) ; gl. Pixel. Storei ( GL_UNPACK_ALIGNMENT, 1 ) ; glu. Build 2 DMipmaps ( GL_TEXTURE_2 D, 3, width, height, type, GL_UNSIGNED_BYTE, pixels ); gl. Tex. Parameteri ( GL_TEXTURE_2 D, GL_TEXTURE_WRAP_S, GL_REPEAT) ; gl. Tex. Parameteri ( GL_TEXTURE_2 D, GL_TEXTURE_WRAP_T, GL_REPEAT) ; gl. Tex. Parameteri ( GL_TEXTURE_2 D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) ; gl. Tex. Parameteri ( GL_TEXTURE_2 D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) ; gl. Tex. Envi ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) ; gl. Enable ( GL_TEXTURE_2 D ) ;
Пример загрузки текстуры ( библиотека GLAux ) bool Load. Texture. From. File ( char* File. Name, int &Width, int &Height, GLenum &Type, unsigned char *Pixels ) { AUX_RGBImage. Rec* bmp = aux. DIBImage. Load (File. Name ) ; if ( !bmp ) return (false) ; Width = bmp >size. X ; Height = bmp >size. Y ; Pixels = bmp >data ; Type = GL_RGB ; return (true) ; }
Пример загрузки текстуры ( библиотека Free. Image) bool Load. Texture. From. File ( char* File. Name, int &Width, int &Height, GLenum &Type, unsigned char *Pixels ) { FREE_IMAGE_FORMAT format = Free. Image_Get. File. Type ( File. Name, 0 ) ; FIBITMAP* bmp = Free. Image_Load ( format, File. Name ) ; if ( !bmp ) return (false); bmp = Free. Image_Convert. To. Standard. Type ( bmp ) ; Width = Free. Image_Get. Width ( bmp ) ; Height = Free. Image_Get. Height ( bmp ) ; Pixels = Free. Image_Get. Bits ( bmp ) ; Type = GL_RGB ; return (true) ; }
Пример загрузки текстуры ( библиотека Dev. IL ) bool Load. Texture. From. File ( char* File. Name, int &Width, int &Height, GLenum &Type, unsigned char *Pixels ) { il. Load ( IL_BMP, File. Name ); if ( il. Get. Error() != IL_NO_ERROR ) return (false) ; Width = il. Get. Integer ( IL_IMAGE_WIDTH ) ; Height = il. Get. Integer ( IL_IMAGE_HEIGHT ) ; Pixels = il. Get. Data(); Type = GL_RGB ; return (true) ; }
Пример загрузки текстуры ( функция Load. Image ) bool Load. Texture. From. File ( char* File. Name, int &Width, int &Height, GLenum &Type, unsigned char *Pixels ) { HBITMAP h. BMP = (HBITMAP) Load. Image ( NULL, File. Name, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE) ; if ( !h. BMP ) return (false) ; BITMAP bmp ; Get. Object ( h. BMP, sizeof(bmp), &bmp) ; Width = bmp. bm. Width ; Height = bmp. bm. Height ; Pixels = bmp. bm. Bits ; Type = GL_BGR_EXT ; return (true) ; } Ограничение: файл должен быть формата BMP
Пример загрузки текстуры ( функция fread ) bool Load. Texture. From. File ( char* File. Name, int &Width, int &Height, GLenum &Type, unsigned char *Pixels ) { unsigned char data 54 [54] ; // первые 54 байта в файле BMP (служебная информация) FILE *file = fopen ( File. Name, "rb" ) ; if ( !file ) return ( false ) ; int err = fread ( data 54, 1, 54, file ); if (err != 1 ) return (false) ; Width = * ( data 54 + 18 ) ; Height = * ( data 54 + 22 ) ; int size = * ( data 54 + 10 ); if( size != 54) return ( false ) ; size = Width * Height * 3 ; Pixels = new unsigned char [ size ] ; err = fread ( Pixels, size, 1, file ) ; if (err != size ) return (false) ; fclose ( file ); Type = GL_BGR_EXT ; return (true) ; } Ограничение: файл должен быть несжатым BMP 24 b
Пример наложения текстурных координат 1 ( влияние порядка )
Пример наложения текстурных координат 2 ( влияние порядка )
Пример наложения текстурных координат 3 ( влияние порядка )
Пример влияния параметров ( размеры )
Пример влияния параметров (наложение линейное и ближайшее) gl. Tex. Parameteri ( *, GL_TEXTURE_MIN_FILTER, ? ) GL_NEAREST (растяжение по 1 ближайшей точке) GL_LINEAR (растяжение по 4 соседним точкам)
Пример влияния параметров ( дублирование и обрезка ) gl. Tex. Parameteri ( *, GL_TEXTURE_WRAP_S, ? ) gl. Tex. Parameteri ( *, GL_TEXTURE_WRAP_T, ? ) gl. Tex. Coord 2 f (1, 1) → gl. Tex. Coord 2 f (2, 1) GL_REPEAT (дублирование) GL_CLAMP (запрет дублирования)
Пример влияния параметров ( игнорирование цвета объекта ) gl. Tex. Envf( *, GL_TEXTURE_ENV_MODE, GL_REPLACE ) Запрет влияния воздействия текстуры на второй объект Влияние воздействия текстуры на второй объект
Пример влияния параметров ( учет цвета объекта ) gl. Tex. Envf( *, GL_TEXTURE_ENV_MODE, ? ); GL_MODULATE GL_BLEND
Пример влияния параметров ( учет цвета другого объекта ) gl. Enable ( GL_COLOR_LOGIC_OP ) gl. Logic. Op ( GL_AND ) gl. Tex. Envf( *, GL_TEXTURE_ENV_MODE, GL_MODULATE ) gl. Disable ( * ) gl. Enable ( * )
Пример влияния параметров ( ошибка RGB/BGR ) glu. Build 2 DMipmaps ( *, *, GL_BGR_EXT, *, * ) glu. Build 2 DMipmaps ( *, *, GL_RGB, *, * )
Пример влияния параметров (наложение текстур) gl. Tex. Envf( *, GL_TEXTURE_ENV_MODE, GL_REPLACE ) gl. Tex. Envf( *, GL_TEXTURE_ENV_MODE, GL_MODULATE )
Пример влияния параметров (наложение на сферу) GLUquadric. Obj * obj = glu. New. Quadric () ; glu. Quadric. Texture ( obj, GL_TRUE ) ; glu. Quadric. Draw. Style( obj, GLU_FILL ) ; glu. Sphere ( obj, 100, 16 ) ; glu. Delete. Quadric ( obj ) ; gl. Rotatef ( 90, 1, 0, 0 ) ; glu. Quadric. Draw. Style ( obj, GLU_LINE ) ;
Рельефная текстура (Bump Mapping) Бампмаппинг - это метод симуляции неровностей (моделирования микрорельефа) на плоской поверхности без больших вычислительных затрат и изменения геометрии, поскольку происходит на пиксельном уровне. Для каждого пикселя поверхности выполняется вычисление освещения, исходя из значений в специальной карте высот (bumpmap), которая представляет собой обычно 8 -битовую текстуру, цвет точек которой определяет высоту соответствующей точки рельефа) Т. е. расчет освещенности выполняется с измененной нормалью.
Нормал-маппинг (Normal Mapping) В то время как бампмаппинг всего лишь изменяет существующую нормаль для точек поверхности, нормалмаппинг полностью заменяет нормали при помощи выборки их значений из специально подготовленной карты нормалей (normal map), которые также представляют из себя специальные текстуры с сохраненными в них заранее просчитанными значениями нормалей, представленными в виде компонент цвета RGB
Параллакс-маппинг (Parallax Mapping, Offset Mapping ) В отличии от Normal Mapping данный метод искажает наложение текстуры, изменяя текстурные координаты так, что под разными углами, поверхность выглядит выпуклой, хотя в реальности поверхность плоская и не изменяется. Иными словами, Parallax Mapping - это техника аппроксимации эффекта смещения точек поверхности в зависимости от изменения точки зрения. Идея метода состоит в том, чтобы возвращать текстурные координаты той точки, где видовой вектор пересекает поверхность. Это требует просчета лучей (рейтрейсинг) для карты высот.
Карты смещения (Displacement Mapping) Этот метод изменяет положение вершин треугольников, сдвигая их по нормали на величину, исходя из значений в картах смещения (displacement map), которые представляет собой обычно 8 -битную текстуру (как у bumpmap) Во время работы метод разбивает (тесселирует) исходную модель на большое количество более мелких примитивов, вершины которых и сдвигаются по нормали в зависимости от карт смещения.
Сравнение текстурных методов 33


