Часть 3-4.ppt
- Количество слайдов: 15
Интерактивная Компьютерная Графика Часть 3 -4 (изображения)
Вывод изображения на экран /* Задание растровой позиции для вывода изображение (левый нижний угол) */ gl. Raster. Pos 2 i ( Pos. X, Pos. Y ) /* Определение масштабирования пикселя */ gl. Pixel. Zoom ( Scale. X, Scale. Y ) /* Устанавливание параметров выравнивания (по 1 байту) */ gl. Pixel. Storei (GL_UNPACK_ALIGNMENT, 1 ) /* Вывод одномерного битового массива в растровую позицию */ void gl. Bitmap ( Width, Height, Pos. X, Pos. Y, d. X, d. Y, bitmap ) /* Отсечение области экрана (показ только в указанном прямоугольнике) */ void gl. Scissor ( Pos. X, Pos. Y , Width, Height)
Буфер изображения /* Вывод массива пикселей на экран (в Буфер) с растровой позиции */ gl. Draw. Pixels ( Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pixels ) /* Вывод массива пикселей в массив из Буфера */ gl. Read. Pixels ( Pos. X, Pos. Y, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pixels ) /* Внутреннее копирование массива пикселей Буфера в растровую позицию */ gl. Copy. Pixels (Pos. X, Pos. Y, Width, Height, GL_RGB )
Буферы накопления Дополнительные внутренние буферы для временного хранения визуальных изображений (зависит от версии): GL_FRONT, GL_BACK, GL_LEFT, GL_RIGHT, GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT , GL_BACK_RIGHT GL_AUX 0, GL_AUX 1, GL_AUX 2, GL_AUX 3 /* Определение используемых буферов */ gl. Draw. Buffer ( buffer ) // буферы для записи gl. Read. Buffer ( buffer ) // буферы для чтения // buffer = GL_FRONT – для однократной буферизации (по умолчанию) // buffer = GL_BACK – для двойной буферизации (по умолчанию)
Буфер аккумулятора Дополнительный внутренний буфер для временного хранения визуальных изображений с возможностью накопления значений пикселей и возможностью попиксельных операций. Используются для получения эффектов нерезкости, сглаживания, «мягких» теней и т. п. /* Операции с буфером аккумулятора */ gl. Accum ( oper, value ) Операция Описание GL_LOAD Пиксели из буфера чтения домножаются на value и заносятся в БА GL_ACCUM Пиксели из буфера чтения домножаются на value и складываются в БА GL_MULT Пиксели в БА домножаются на value GL_ ADD Пиксели в БА складываются с value GL_ RETURN Пиксели из БА домножаются на value и заносятся в буфер записи /* Очистка буфера аккумулятора цветом (R, G, B, A) */ gl. Clear. Accum ( R, G, B, A)
Буферы трафарета Буфер используется для наложения маски (трафарета) на пиксельное изображение передачей его в буфер Кадра (причем, трафаретом может выступать любой графический примитив) Буфер используется для вырезания одной фигуры из другой, для реализации отражений и теней, … gl. Enable ( GL_STENCIL_TEST ) // включение Буфера gl. Disable ( GL_STENCIL_TEST ) // выключение Буфера gl. Stencil. Mask( bits ) // определение, какие же биты могут писаться в Буфер gl. Clear. Stencil ( value ) // значение для очистки Буфера gl. Clear ( GL_STENCIL_BUFFER_BIT ) // очистка Буфера значением value /* Сравнение (GL_LESS, GL_EQUAL, GL_GEQUAL, …) значений buf из БТ /* со значением param по маске mask: ( param & mask ) «операция» (buf & mask ) */ gl. Stencil. Func ( oper, param, mask) /* Действия в зависимости от результатов сравнения ( GL_KEEP, GL_ZERO, GL_INCR, …): */ gl. Stencil. Op ( fail, zpass ) // fail – если отрицательный результат сравнения // zfail – если отрицательный результат сравнения на глубину // zpass – если положительный результат сравнения на глубину
Скай. Бокс (Sky. Box) Sky. Box - объект, играющий роль неба и горизонта. Представляет собой несложную трёхмерную модель (куб, цилиндр, сфера), с внутренней стороны которой натянута так называемая «кубическая текстура» неба, гор, океана или еще какого либо изображения горизонта. Sky. Box всегда располагается так, чтобы камера была в его центре даже при движении, так что изображённые на скайбоксе объекты выглядят удалёнными в бесконечность. При этом, Sky. Box может состоять из нескольких слоев, двигающихся с разной скоростью для имитации, например, движения облаков – это удобно реализовать через рассмотренные ранее Буферы. Фактически, текстура накладывающаяся на Sky. Box, представляет собой панорамное изображение.
Вывод текста на экран Текст выводится в позицию, указанную при предваряющем вызове команды gl. Raster. Pos 2 i ( Pos. X, Pos. Y) /* Вариант 1: текст красивее */ glut. Bitmap. Character ( font, char ) // int char – символ // void* font – используемый шрифт: // GLUT_BITMAP_HELTICA_10 // GLUT_BITMAP_HELTICA_12 // GLUT_BITMAP_HELTICA_18 // GLUT_BITMAP_TIMES_ROMAN_10 // GLUT_BITMAP_TIMES_ROMAN_24 // GLUT_BITMAP_8_BY_13 // GLUT_BITMAP_9_BY_15 /* Вариант 2: текст можно масштабировать и поворачивать */ glut. Stroke. Character (font, char ) // int char – символ // int* font – используемый шрифт : // GLUT_STROKE_ROMAN // пропорциональный шрифт // GLUT_STROKE_MONO_ROMAN // моноширинный шрифт Общее замечание: позиция для следующей буквы автоматически сдвигается вправо
Загрузка изображений Ø Вручную ( <stdlib. h> ) • (int) fread ( pixels, pixels_count, 1, file ) Ø С помощью Windows ( <windows. h> ) • (HBITMAP) Load. Image ( NULL, file_name, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE ) Ø С помощью Microsoft: Auxiliary Library (Glaux) • (AUX_RGBImage. Rec*) aux. DIBImage. Load ( file_name ) Ø С помощью Dev. IL (Open. IL) • ilut. Ogl. Load. Image ( file_name ) • http: //openil. sourceforge. net Ø С помощью Free. Image • Free. Image_Load ( format, file_name) • http: //freeimage. sourceforge. net /* Указание на то, что под RGB отводится по 1 байту в файле */ gl. Pixel. Storei(GL_UNPACK_ALIGNMENT, 1)
Прозрачность /* Разрешить учет четвертой компоненты цвета в RGBA */ gl. Enable ( GL_ALPHA_TEST ) /* Разрешить прозрачность (наложение цветов) */ gl. Enable (GL_BLEND ) /* Определение алгоритма смешения цветов */ gl. Blend. Func ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) Замечания: 1. включать только для конкретных объектов и сразу отключать 2. в первую очередь должны быть указаны непрозрачные объекты, а уж потом – прозрачные объекты, начиная с дальних
Прозрачность (пример) gl. Enable ( GL_ALPHA_TEST ); gl. Enable ( GL_BLEND ); gl. Blend. Func ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); gl. Color 4 f ( 1, 0, 0, 1. 0 ); glut. Solid. Sphere (200, 16); // Выполняется тест глубины успешно, т. к. куба пока нет gl. Color 4 f( 1, 1, 0, 0. 5 ); glut. Solid. Cube (200); // Выполняется тест глубины успешно, т. к. стенка цилиндра ближе, чем сфера /* Результат: в буфере рисуется цилиндр, он закрывает сферу с учетом прозрачности */ gl. Color 4 f ( 1, 0, 0, 1. 0 ); glut. Solid. Sphere (200, 16); // Выполняется тест глубины успешно, т. к. цилиндра пока нет gl. Color 4 f ( 1, 0, 0, 1. 0 ); glut. Solid. Cube (200, 16); // Выполняется тест глубины аварийно, т. к. сфера создается за кубом /* Результат: в буфере рисуется только цилиндр */ gl. Disable (GL_BLEND ); gl. Disable (GL_ALPHA_TEST );
Прозрачность (пример) gl. Color 4 f ( 1, 0, 0, 1. 0 ); glut. Solid. Sphere (200, 16); gl. Color 4 f ( 1, 1, 0, 0. 5 ); glut. Solid. Cube (200); gl. Color 4 f ( 1, 0, 0, 1. 0 ); glut. Solid. Sphere (200, 16);
Прозрачность (пример 2)
Туман Для чего: Легкое затуманивание сцены создает реалистичный эффект, а частенько может и скрыть некоторые артефакты, которые появляются, когда в сцене присутствуют отдаленные объекты. Особенности реализации: Туман в Open. GL реализуется путем изменения цвета объектов в сцене в зависимости от их глубины, т. е расстояния до точки наблюдения. Изменение цвета происходит либо для вершин примитивов, либо для каждого пикселя на этапе растеризации (в зависимости от реализации Open. GL) /* Включение эффекта затуманивания */ gl. Enable ( GL_FOG ) /* Определение цвета тумана в вершине */ void gl. Fogfv ( GL_FOG_COLOR, float* colors 4) /* Метод вычисления интенсивности тумана в вершине */ void gl. Fogi (GL_FOG_MODE, value) value формула GL_FOG_DENSITY GL_EXP exp ( – d * z ) d GL_EXP 2 exp [ –(d * z)^2 ] d GL_LINEAR (e–z)/(e–s) GL_FOG_START GL_FOG_END s e z – расстояние до наблюдателя
Туман (пример) float сolor 4 [] = { 0. 7, 0. 7 } ; // цвет тумана float pos 0 = -5 ; // позиция начало тумана float pos 1 = 10 ; // позиция конца тумана gl. Enable ( GL_FOG ) ; gl. Fogi ( GL_FOG_MODE, GL_LINEAR ) ; gl. Fogf ( GL_FOG_START, pos 0 ) ; gl. Fogf ( GL_FOG_END, pos 1 ) ; gl. Fogfv ( GL_FOG_COLOR, сolor 4 ) ;
Часть 3-4.ppt