
- •Глава 1. Основы OpenGl 8
- •Введение
- •ОсновыOpenGl
- •Основные возможности
- •ИнтерфейсOpenGl
- •АрхитектураOpenGl
- •Синтаксис команд
- •Пример приложения
- •Контрольные вопросы:
- •Рисование геометрических объектов
- •Процесс обновления изображения
- •Вершины и примитивы
- •Положение вершины в пространстве
- •Цвет вершины
- •Нормаль
- •Операторные скобкиglBegin/glEnd
- •Дисплейные списки
- •Массивы вершин
- •Контрольные вопросы
- •Преобразования объектов
- •Работа с матрицами
- •Модельно-Видовые преобразования
- •Проекции
- •Область вывода
- •Контрольные вопросы
- •Материалы и освещение
- •Модель освещения
- •Спецификация материалов
- •Описание источников света
- •Создание эффекта тумана
- •Контрольные вопросы
- •Текстурирование
- •Подготовка текстуры
- •Наложение текстуры на объекты
- •Текстурные координаты
- •Контрольные вопросы
- •Операции с пикселями
- •Смешивание изображений. Прозрачность
- •Буфер-накопитель
- •Буфер маски
- •Управление растеризацией
- •Приемы работы сOpenGl
- •Устранение ступенчатости
- •Построение теней
- •Зеркальные отражения
- •Оптимизация программ
- •Организация приложения
- •Высокоуровневая оптимизация
- •Низкоуровневая оптимизация
- •Оптимизация вызовов OpenGl
- •Передача данных в OpenGl
- •Преобразования
- •Растеризация
- •Текстурирование
- •Очистка буферов
- •СтруктураGlut-приложения
- •Примитивы библиотекGlUиGlut
- •Настройка приложенийOpenGl
- •Демонстрационные программы
- •Пример 1: Простое glut-приложение
- •Пример 2: Модель освещения OpenGl
- •Пример 3: Текстурирование
- •Примеры практических заданий
- •Виртуальные часы
- •Интерактивный ландшафт
- •Литература
- •Предметный указатель
Управление растеризацией
Способ выполнения растеризации примитивов можно частично регулировать командой glHint (target, mode), гдеtarget– вид контролируемых действий, принимает одно из следующих значений
GL_FOG_HINT–точностьвычислений при наложении тумана. Вычисления могут выполняться по пикселям (наибольшая точность) или только в вершинах. Если реализацияOpenGLне поддерживает попиксельного вычисления, то выполняется только вычисление по вершинам.
GL_LINE_SMOOTH_HINT–управлениекачеством прямых. При значенииmode, равнымGL_NICEST, уменьшается ступенчатость прямых за счет большего числа пикселей в прямых.
GL_PERSPECTIVE_CORRECTION_HINT– точность интерполяции координат при вычислении цветов и наложении текстуры. Если реализацияOpenGLне поддерживает режимGL_NICEST, то осуществляется линейная интерполяция координат.
GL_POINT_SMOOTH_HINT– управление качеством точек. При значении параметраmodeравнымGL_NICESTточки рисуются как окружности.
GL_POLYGON_SMOOTH_HINT–управлениекачеством вывода сторон многоугольника.
Параметра modeинтерпретируется следующим образом:
GL_FASTEST- используетсянаиболеебыстрый алгоритм.
GL_NICEST- используетсяалгоритм, обеспечивающий лучшее качество.
GL_DONT_CARE- выбор алгоритма зависит от реализации.
Важно заметить, что командой glHint() программист может только определить свои пожелания относительно того или иного аспекта растеризации примитивов. Конкретная реализацияOpenGLвправе игнорировать данные установки.
Обратите внимание, что glHint()нельзя вызывать между операторными скобкамиglBegin()/glEnd().
Приемы работы сOpenGl
В этой главе мы рассмотрим, как с помощью OpenGL создавать некоторые интересные визуальные эффекты, непосредственная поддержка которых отсутствует в стандарте библиотеки.
Устранение ступенчатости
Начнем с задачи устранения ступенчатости (antialiasing). Эффект ступенчатости (aliasing) возникает в результате погрешностей растеризации примитивов в буфере кадра из-за конечного (и, как, правило, небольшого) разрешения буфера. Есть несколько подходов к решению данной проблемы. Например, можно применять фильтрацию полученного изображения. Также этот эффект можно устранять на этапе растеризации, сглаживая образ каждого примитива. Здесь мы рассмотрим прием, позволяющий устранять подобные артефакты для всей сцены целиком.
Для каждого кадра необходимо нарисовать сцену несколько раз, на каждом проходе немного смещая камеру относительно начального положения. Положения камер, например, могут образовывать окружность. Если сдвиг камеры относительно мал, то погрешности дискретизации проявятся по-разному, и, усредняя полученные изображения, мы получим сглаженное изображение.
Проще всего сдвигать положение наблюдателя, но перед этим нужно вычислить размер сдвига так, чтобы приведенное к координатам экрана значение не превышало, скажем, половины размера пикселя.
Все полученные изображения сохраняем в буфере-накопителе с коэффициентом 1/n, гдеn– число проходов для каждого кадра. Чем больше таких проходов – тем ниже производительность, но лучше результат.
for(i=0;i<samples_count;++i)
/* обычно samples_count лежит в пределах от 5 до 10 */
{
ShiftCamera(i); /* сдвигаем камеру */
RenderScene();
if(i==0)
/* на первой итерации загружаем изображение */
glAccum(GL_LOAD,1/(float)samples_count);
else
/* добавляем к уже существующему */
glAccum(GL_ACCUM,1/(float)samples_count);
}
/* Пишем то, что получилось, назад в исходный буфер */
glAccum(GL_RETURN,1.0);
Следует отметить, что устранение ступенчатости сразу для всей сцены, как правило, связано с серьезным падением производительности визуализации, так как вся сцена рисуется несколько раз. Современные ускорители обычно аппаратно реализуют другие методы, основанные на так называемом ресамплинге изображений.