Главная страница
Навигация по странице:

  • GLKEEP, GLZERO, GLREPLACE, GLINCR

  • GLPERSPECTIVECORRECTIONHINT

  • GL FASTEST

  • Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика


    Скачать 0.66 Mb.
    НазваниеРуководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
    Дата21.10.2022
    Размер0.66 Mb.
    Формат файлаdocx
    Имя файла221937-83556.docx
    ТипРуководство
    #747097
    страница13 из 30
    1   ...   9   10   11   12   13   14   15   16   ...   30
    96

    Глава 7. Операции с пикселями

    Аргумент sfail задает действие в случае отрицательного ре­зультата теста, и может принимать следующие значения:

    GLKEEP, GLZERO, GLREPLACE, GLINCR

    GL_DECR, GL_INVERT —соответственно сохраняет зна­чение в буфере маски, обнуляет его, заменяет на заданное значение (ref), увеличивает, уменьшает или побитово ин­вертирует.

    Аргументы dpfail определяют действия в случае отрицатель­ного результата теста на глубину в z-буфере, a dppass задает действие в случае положительного результата этого теста. Ар­гументы принимают те же значения, что и аргумент sfail. По умолчанию все три параметра установлены на GL_KEEP.

    Для включения маскирования необходимо выполнить коман­ду glEnable(GL_STENCIL_TEST);

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

    Пример использования буфера маски при построении теней и отражений приведен в разделах 8.2 и 8.3.

    7.4. Управление растеризацией

    Способ выполнения растеризации примитивов можно частич­но регулировать командой glffint (target, mode), где target —вид контролируемых действий, принимающий одно из следующих значений:

    GL FOG HINT —точность вычислений при наложении ту­мана. Вычисления могут выполняться по пикселям (наи­большая точность) или только в вершинах. Если реализа­ция OpenGL не поддерживает попиксельного вычисления, то выполняется только вычисление по вершинам;

    7.4- Управление растеризацией 97

    GL_LINE_SMOOTH_HINT —управление качеством пря­мых. При значении mode, равным GL_NICEST, уменьша­ется ступенчатость прямых за счет большего числа пиксе­лей в прямых;

    GLPERSPECTIVECORRECTIONHINT - точность интерполяции координат при вычислении цветов и наложе­нии текстуры. Если реализация OpenGL не поддерживает режим GL_NICEST, то осуществляется линейная интер­поляция координат;

    GL_POINT_SMOOTH_HINT — управление качеством то­чек. При значении параметра mode, равном GL_NICEST, точки рисуются как окружности;

    GLPOLYGONSMOOTHHINT -управление каче­ством вывода сторон многоугольника.

    Параметр mode интерпретируется следующим образом:

    GL FASTEST —используется наиболее быстрый алгоритм;

    GL NICEST —используется алгоритм, обеспечивающий луч­шее качество;

    GL_DONT_CARE —выбор алгоритма зависит от реализа­ции.

    Важно заметить, что командой glffintQ программист может только определить свои пожелания относительно того или ино­го аспекта растеризации примитивов. Конкретная реализация OpenGL вправе игнорировать данные установки.

    Обратите внимание, что glffintQ нельзя вызывать между опе­раторными скобками glBeginQ/glEndQ.

    98

    Глава 7. Операции с пикселями

    7.5. Контрольные вопросы

    1. Какие буферы изображений используются в OpenGL и для чего?

    2. Для чего используется команда glBlendFunc?

    3. Почему для корректного вывода прозрачных объектов тре­буется соблюдение условий упорядоченного вывода прими­тивов с прозрачностью?

    4. Для чего используется буфер-накопитель? Приведите при­мер работы с ним.

    5. Как в OpenGL можно наложить маску на результирующее изображение?

    6. Объясните, для чего применятся команда glffintQ.

    7. Каков эффект выполнения команды glffint(GL_FOG_HINT, GL_DONT_CARE)?

    Часть II

    Приемы работы с OpenGL

    99
    Глава 8.

    Графические алгоритмы на основе OpenGL

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

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

    Начнем с задачи устранения ступенчатости (antialiasing). Эф­фект ступенчатости (aliasing) возникает в результате погрешно­стей растеризации примитивов в буфере кадра из-за конечного (и как правило, небольшого) разрешения буфера. Есть несколько подходов к решению данной проблемы. Например, можно при­менять фильтрацию полученного изображения. Также этот эф­фект можно устранять на этапе растеризации, сглаживая образ каждого примитива. Здесь мы рассмотрим прием, позволяющий устранять подобные артефакты для всей сцены целиком.

    Для каждого кадра необходимо нарисовать сцену несколько

    101

    102 Глава 8. Графические алгоритмы на основе OFENGL

    раз, на каждом проходе немного смещая камеру относительно начального положения. Положения камер, например, могут об­разовывать окружность. Если сдвиг камеры относительно мал, то погрешности дискретизации проявятся по-разному, и, усред­няя полученные изображения, мы получим сглаженное изобра­жение.

    Проще всего сдвигать положение наблюдателя, но перед этим нужно вычислить размер сдвига так, чтобы приведенное к коор­динатам экрана значение не превышало, скажем, половины раз­мера пикселя.

    Все полученные изображения сохраняем в буфере-накопите­ле с коэффициентом 1/п, где п — число проходов для каждого кадра. Чем больше таких проходов — тем ниже производитель­ность, но лучше результат.

    for (i =0;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);

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

    8.2. Построение теней

    103

    8.2. Построение теней

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

    Большинство алгоритмов, предназначенных для построения теней, используют модифицированные принципы перспективной проекции. Здесь рассматривается один из самых простых мето­дов. С его помощью можно получать тени, отбрасываемые трех­мерным объектом на плоскость.

    Общий подход таков: для всех точек объекта находится их проекция параллельно вектору, соединяющему данную точку и точку, в которой находится источник света, на некую заданную плоскость. Тем самым получаем новый объект, целиком лежа­щий в заданной плоскости. Этот объект и является тенью исход­ного.

    Рассмотрим математические основы данного метода.

    Пусть:

    Р —точка в трехмерном пространстве, которая отбрасывает тень.

    L — положение источника света, который освещает данную точ­ку-

    S = a(L — Р) — Р — точка, в которую отбрасывает тень точка Р, где а —параметр.

    Предположим, что тень падает на плоскость z = 0. В этом случае а = zp/(zi — zp). Следовательно,

    104 Глава 8. Графические алгоритмы па основе OFENGL

    = {XpZl


    Vs

    Zs =

    = iVpZi

    zizp)/{zi yiZp)/{zi 0

    zP) zP)

    Введем однородные координаты:

    xs

    Vs =

    Zs=

    w' =

    xslws

    y's/w's 0

    zi - zp

    Отсюда координаты S могут быть получены с использовани­ем умножения матриц следующим образом:

    I X в

    V's

    0 w's) = (xs Уз Zs l)


    (Zl

    0

    0 0

    zi 0

    0

    -Xl

    Vo

    -yi о

    0 0

    1




    Для того, чтобы алгоритм мог рассчитывать тень, падающую на произвольную плоскость, рассмотрим произвольную точку на линии между S и Р, представленную в однородных координатах:

    аР + ЬЬ, где а и Ъ — скалярные параметры.

    Следующая матрица задает плоскость через координаты ее нормали:

    (хп\

    Уп

    1   ...   9   10   11   12   13   14   15   16   ...   30


    написать администратору сайта