Скачиваний:
115
Добавлен:
23.02.2015
Размер:
702.98 Кб
Скачать
    1. Управление растеризацией

Способ выполнения растеризации примитивов можно частично регулировать командой 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().

  1. Приемы работы сOpenGl

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

    1. Устранение ступенчатости

Начнем с задачи устранения ступенчатости (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);

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

Соседние файлы в папке Программирование графических приложений