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

  • Можно ли задавать положение источника относительно локальных координат объекта 5.5. Контрольные вопросы75 5) Как задать конусный источник света

  • 1) Что такое текстура и для чего используются текстуры

  • 5) Для чего используются уровни детализации текстуры (mip- mapping)

  • Планета знаний


    Скачать 1.68 Mb.
    НазваниеПланета знаний
    АнкорOpenGL book
    Дата14.06.2021
    Размер1.68 Mb.
    Формат файлаpdf
    Имя файлаgltutorialcourse2.pdf
    ТипКнига
    #217321
    страница4 из 9
    1   2   3   4   5   6   7   8   9
    3) Как задать положение источника света таким образом, что- бы он всегда находился в точке положения наблюдателя?
    4) Как задать фиксированное положение источника света?

    Можно ли задавать положение источника относительно локальных координат объекта?

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

    75 5) Как задать конусный источник света?
    6) Если в сцене включено освещение, но нет источников света,

    какой цвет будут иметь объекты?

    Глава 6.
    Текстурирование
    Под текстурой будем понимать изображение, которое надо определенным образом нанести на объект, например, для прида- ния иллюзии рельефности поверхности.
    Для работы с текстурой следует выполнить следующую по- следовательность действий:
    € выбрать изображение и преобразовать его к нужному фор- мату;
    € передать изображение в OpenGL;
    € определить, как текстура будет наноситься на объект и как она будет с ним взаимодействовать;
    € связать текстуру с объектом.
    6.1. Подготовка текстуры
    Для использования текстуры необходимо сначала загрузить в память нужное изображение и передать его OpenGL.
    77

    78
    Глава 6. Текстурирование
    Считывание графических данных из файла и их преобразо- вание можно проводить вручную. В приложении Б приведен ис- ходный текст функции для загрузки изображения из файла в формате BMP.
    Можно также воспользоваться функцией, входящей в состав библиотеки GLAUX (для ее использования надо дополнительно подключить glaux.lib), которая сама проводит необходимые опе- рации. Это функция
    AUX_RGBImageRec* auxDIBImageLoad ( const char * f i l e )
    где
    le
     название файла с расширением *.bmp или *.dib. Функ- ция возвращает указатель на область памяти, где хранятся пре- образованные данные.
    При создании образа текстуры в памяти следует учитывать указываемые требования. Во-первых, размеры текстуры, как по горизонтали, так и по вертикали должны представлять собой степени двойки. Это требование накладывается для компактно- го размещения текстуры в текстурной памяти и способствует ее эффективному использованию. Работать только с такими тек- стурами конечно неудобно, поэтому после загрузки их надо пре- образовать. Изменение размеров текстуры можно провести с по- мощью команды void gluScaleImage (GLenum format , GLint widthin ,
    GL heightin , GLenum typein ,
    const void * datain ,
    GLint widthout ,
    GLint heightout , GLenum typeout ,
    void * dataout )
    В качестве значения параметра format обычно используется значение
    GL_RGB
    или
    GL_RGBA
    , определяющее формат хране- ния информации. Параметры widthin
    ,
    heightin
    ,
    widhtout
    ,
    heightout определяют размеры входного и выходного изображений, а с по- мощью typein и
    typeout задается тип элементов массивов, распо-

    6.1. Подготовка текстуры
    79
    ложенных по адресам datain и
    dataout
    . Как и обычно, это мо- жет быть тип
    GL_UNSIGNED_BYTE
    ,
    GL_SHORT
    ,
    GL_INT
    и т.д.
    Результат своей работы функция заносит в область памяти, на которую указывает параметр dataout
    Во-вторых, надо предусмотреть случай, когда объект после растеризации оказывается по размерам значительно меньше на- носимой на него текстуры. Чем меньше объект, тем меньше должна быть наносимая на него текстура и поэтому вводит- ся понятие уровней детализации текстуры (mipmap). Каждый уровень детализации задает некоторое изображение, которое яв- ляется, как правило, уменьшенной в два раза копией оригинала.
    Такой подход позволяет улучшить качество нанесения текстуры на объект. Например, для изображения размером 2
    m
    Ч 2
    n можно построить max(m, n) + 1 уменьшенных изображений, соответ- ствующих различным уровням детализации.
    Эти два этапа создания образа текстуры во внутренней па- мяти OpenGL можно провести с помощью команды void gluBuild2DMipmaps (GLenum target ,
    GLint components ,
    GLint width , GLint height ,
    GLenum format , GLenum type ,
    const void * data )
    где параметр target должен быть равен
    GL_TEXTURE_2D
    . Па- раметр components определяет количество цветовых компонент текстуры и может принимать следующие основные значения:
    GL_LUMINANCE  одна компонента  яркость (текстура будет монохромной);
    GL_RGB  красный, синий, зеленый;
    GL_RGBA  красный, синий, зеленый, альфа (см. п. 7.1).
    Параметры width
    ,
    height
    ,
    data определяют размеры и распо- ложение текстуры соответственно, а format и
    type имеют анало- гичный смысл, что и в команде gluScaleImage()

    80
    Глава 6. Текстурирование
    После выполнения этой команды текстура копируется во внутреннюю память OpenGL, и поэтому память, занимаемую исходным изображением, можно освободить.
    В OpenGL допускается использование одномерных текстур,
    то есть размера 1 Ч N, однако это всегда надо указывать, за- давая в качестве значения target константу
    GL_TEXTURE_1D
    Одномерные текстуры используются достаточно редко, поэтому не будем останавливаться на этом подробно.
    При использовании в сцене нескольких текстур, в OpenGL
    применяется подход, напоминающий создание списков изображе- ний (так называемые текстурные объекты). Сначала с помощью команды void glGenTextures ( GLsizei n , GLuint* t e x t u r e s )
    надо создать n идентификаторов текстур, которые будут запи- саны в массив textures
    . Перед началом определения свойств оче- редной текстуры следует сделать ее текущей (ѕпривязатьї тек- стуру), вызвав команду void glBindTexture (GLenum target , GLuint t e x t u r e )
    где target может принимать значения
    GL_TEXTURE_1D
    или
    GL_TEXTURE_2D
    , а параметр texture должен быть равен иден- тификатору той текстуры, к которой будут относиться последу- ющие команды. Для того, чтобы в процессе рисования сделать текущей текстуру с некоторым идентификатором, достаточно опять вызвать команду glBindTexture()
    c соответствующим зна- чением target и
    texture
    . Таким образом, команда glBindTexture()
    включает режим создания текстуры с идентификатором texture
    ,
    если такая текстура еще не создана, либо режим ее использова- ния, то есть делает эту текстуру текущей.
    Так как не всякая аппаратура может оперировать текстурами большого размера, целесообразно ограничить размеры текстуры до 256Ч256 или 512Ч512 пикселей. Отметим, что использование небольших текстур повышает эффективность программы.

    6.2. Наложение текстуры на объекты
    81 6.2. Наложение текстуры на объекты
    При наложении текстуры, как уже упоминалось, надо учи- тывать случай, когда размеры текстуры отличаются от оконных размеров объекта, на который она накладывается. При этом воз- можно как растяжение, так и сжатие изображения, и то, как бу- дут проводиться эти преобразования, может серьезно повлиять на качество построенного изображения. Для определения поло- жения точки на текстуре используется параметрическая система координат (s, t), причем значения s и t находятся в отрезке [0, 1]
    (см. рисунок 6.1)
    Рис. 6.1. Текстурные координаты
    Для изменения различных параметров текстуры применяют- ся команды:
    void glTexParameter [ i f ] (GLenum target , GLenum pname ,
    GLenum param )
    void glTexParameter [ i f ] v (GLenum target , GLenum pname ,
    Glenum* params )
    Параметр target принимает значения
    GL_TEXTURE_1D
    или
    GL_TEXTURE_2D
    ,
    pname определяет, какое свойство будем ме- нять, а с помощью param или params устанавливается новое зна- чение. Возможные значения pname
    :
    GL_TEXTURE_MIN_FILTER  параметр param опреде-

    82
    Глава 6. Текстурирование ляет функцию, которая будет использоваться для сжатия текстуры. При значении
    GL_NEAREST
    будет использовать- ся один (ближайший), а при значении
    GL_LINEAR
     четы- ре ближайших элемента текстуры.
    Значение по умолчанию:
    GL_LINEAR
    GL_TEXTURE_MAG_FILTER  параметр param опреде- ляет функцию, которая будет использоваться для увеличе- ния (растяжения) текстуры. При значении
    GL_NEAREST
    будет использоваться один (ближайший), а при значении
    GL_LINEAR
     четыре ближайших элемента текстуры.
    Значение по умолчанию:
    GL_LINEAR
    GL_TEXTURE_WRAP_S  параметр param устанавлива- ет значение координаты s, если оно не входит в отрезок
    [0, 1]
    . При значении
    GL_REPEAT
    целая часть s отбрасы- вается, и в результате изображение размножается по по- верхности. При значении
    GL_CLAMP
    используются крае- вые значения (0 или 1), что удобно использовать, если на объект накладывается один образ.
    Значение по умолчанию:
    GL_REPEAT
    GL_TEXTURE_WRAP_T  аналогично предыдущему зна- чению, только для координаты t.
    Использование режима
    GL_NEAREST
    повышает скорость на- ложения текстуры, однако при этом снижается качество, так как,
    в отличие от
    GL_LINEAR
    , интерполяция не производится.
    Для того чтобы определить, как текстура будет взаимодей- ствовать с материалом, из которого сделан объект, используются команды void glTexEnv [ i f ]
    (GLenum target , GLenum pname ,
    GLtype param )
    void glTexEnv [ i f ] v (GLenum target , GLenum pname ,
    GLtype *params )

    6.2. Наложение текстуры на объекты
    83
    Параметр target должен быть равен
    GL_TEXTURE_ENV
    ,
    а в качестве pname рассмотрим только одно значение
    GL_TEXTURE_ENV_MODE
    , которое применяется наиболее часто.
    Наиболее часто используемые значения параметра param
    :
    GL_MODULATE  конечный цвет находится как произведе- ние цвета точки на поверхности и цвета соответствующей ей точки на текстуре.
    GL_REPLACE  в качестве конечного цвета используется цвет точки на текстуре.
    Следующий пример кода демонстрирует общий подход к со- зданию текстур:
    /* нужное нам количество текстур */
    #define NUM_TEXTURES 10
    /* идентификаторы текстур */
    int TextureIDs [NUM_TEXTURES] ;
    /* образ текстуры */
    AUX_RGBImageRec *pImage ;
    /* 1) получаем идентификаторы текстур */
    glGenTextures (NUM_TEXTURES, TextureIDs ) ;
    /* 2) выбираем текстуру для модификации параметров */
    glBindTexture ( TextureIDs [ i ] ) ; /* 0<=i/* 3) загружаем текстуру .
    Размеры текстуры "??? степень 2 */
    pImage=dibImageLoad ( " t e x t u r e .bmp" ) ;
    i f ( Texture !=NULL)
    {
    /* 4) передаем текстуру OpenGL и задаем параметры*/

    84
    Глава 6. Текстурирование
    /* выравнивание по байту */
    g l P i x e l S t o r e i (GL_UNPACK_ALIGNMENT, 1 ) ;
    gluBuildMipmaps (GL_TEXTURE_2D,GL_RGB, pImage?>sizeX ,
    pImage?>sizeY , GL_RGB, GL_UNSIGNED_BYTE,
    pImage?>data ) ;
    glTexParameterf (GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,
    ( float )GL_LINEAR) ;
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
    ( float )GL_LINEAR) ;
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
    ( float )GL_REPEAT) ;
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
    ( float )GL_REPEAT) ;
    glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
    ( float )GL_REPLACE) ;
    /* 5) удаляем исходное изображение . */
    f r e e ( Texture ) ;
    }
    else
    Error ( ) ;
    6.3. Текстурные координаты
    Перед нанесением текстуры на объект необходимо установить соответствие между точками на поверхности объекта и на самой текстуре. Задавать это соответствие можно двумя методами: от- дельно для каждой вершины или сразу для всех вершин, задав

    6.3. Текстурные координаты
    85
    параметры специальной функции отображения. Первый метод реализуется с помощью команд void glTexCoord [ 1 2 3 4 ] [ s i f d ]
    ( type coord )
    void glTexCoord [ 1 2 3 4 ] [ s i f d ] v ( type * coord )
    Чаще всего используются команды glTexCoord2*(type s, type t)
    ,
    задающие текущие координаты текстуры. Понятие текущих ко- ординат текстуры аналогично понятиям текущего цвета и теку- щей нормали и является атрибутом вершины. Однако даже для куба нахождение соответствующих координат текстуры являет- ся довольно трудоемким занятием, поэтому в библиотеке GLU
    помимо команд, проводящих построение таких примитивов как сфера, цилиндр и диск, предусмотрено также наложение на них текстур. Для этого достаточно вызвать команду void gluQuadricTexture (
    GLUquadricObj* quadObject ,
    GLboolean textureCoords )
    с параметром textureCoords равным
    GL_TRUE
    , и тогда текущая текстура будет автоматически накладываться на примитив.
    Второй метод реализуется с помощью команд void glTexGen [ i f d ]
    (GLenum coord , GLenum pname ,
    GLtype param )
    void glTexGen [ i f d ] v (GLenum coord , GLenum pname ,
    const GLtype *params )
    Параметр coord определяет для какой координаты задается формула, и может принимать значение
    GL_S
    ,
    GL_T
    ;
    pname мо- жет быть равен одному из следующих значений:
    GL_TEXTURE_GEN_MODE  задает функцию для на- ложения текстуры. В этом случае аргумент param прини- мает значения:
    GL_OBJECT_LINEAR  значение соответствующей текстурной координаты определяется расстоянием до

    86
    Глава 6. Текстурирование плоскости, задаваемой с помощью значения pname
    GL_OBJECT_PLANE
    (см. ниже). Формула выглядит следующим образом:
    g = x ? x p
    + y ? y p
    + z ? z p
    + w ? w p
    где g  соответствующая текстурная координата (s или p), x, y, z, w  координаты соответствующей точ- ки. x p
    , y p
    , z p
    , w p
     коэффициенты уравнения плоско- сти. В формуле используются координаты объекта.
    GL_EYE_LINEAR  аналогично
    GL_OBJECT_LINEAR
    ,
    только в формуле используются видовые координаты.
    Т.е. координаты текстуры объекта в этом случае за- висят от положения этого объекта.
    GL_SPHERE_MAP  позволяет эмулировать отраже- ние от поверхности объекта. Текстура как бы ѕобо- рачиваетсяї вокруг объекта. Для данного метода ис- пользуются видовые координаты и необходимо зада- ние нормалей.
    GL_OBJECT_PLANE  позволяет задать плоскость, рас- стояние до которой будет использоваться при генерации ко- ординат, если установлен режим
    GL_OBJECT_LINEAR
    . В
    этом случае параметр params является указателем на мас- сив из четырех коэффициентов уравнения плоскости.
    GL_EYE_PLANE  аналогично предыдущему значению. Поз- воляет задать плоскость для режима
    GL_EYE_LINEAR
    Для установки автоматического режима задания текстурных координат необходимо вызвать команду glEnable с параметром
    GL_TEXTURE_GEN_S
    или
    GL_TEXTURE_GEN_P
    Программа, использующая наложение текстуры и анимацию,
    приведена в приложении Б.

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

    1) Что такое текстура и для чего используются текстуры?
    2) Что такое текстурные координаты и как задать их для объ- екта?
    3) Какой метод взаимодействия с материалом нужно исполь- зовать, если текстура представляет собой картину, вися- щую на стене (
    GL_MODULATE
    ,
    GL_REPLACE
    )?
    4) Перечислите известные вам методы генерации текстурных координат в OpenGL.

    5) Для чего используются уровни детализации текстуры (mip- mapping)?
    6) Что такое режимы фильтрации текстуры и как задать их в OpenGL?

    Глава 7.
    Операции с пикселями
    После проведения всех операций по преобразованию коор- динат вершин, вычисления цвета и т.п., OpenGL переходит к этапу растеризации, на котором происходит растеризация всех примитивов, наложение текстуры, наложение эффекта тумана.
    Для каждого примитива результатом этого процесса является занимаемая им в буфере кадра область, каждому пикселю этой области приписывается цвет и значение глубины.
    OpenGL использует эту информацию, чтобы записать обнов- ленные данные в буфер кадра. Для этого OpenGL имеет не толь- ко отдельный конвейер обработки пикселей, но и несколько до- полнительных буферов различного назначения. Это позволяет программисту гибко контролировать процесс визуализации на самом низком уровне.
    Графическая библиотека OpenGL поддерживает работу со следующими буферами:
    € несколько буферов цвета;
    € буфер глубины;
    € буфер-накопитель (аккумулятор);
    89

    90
    Глава 7. Операции с пикселями
    € буфер маски.
    Группа буферов цвета включает буфер кадра, но таких буфе- ров может быть несколько. При использовании двойной буфери- зации говорят о рабочем (front) и фоновом (back) буферах. Как правило, в фоновом буфере программа создает изображение, ко- торое затем разом копируется в рабочий буфер. На экране может появиться информация только из буферов цвета.
    Буфер глубины используется для удаления невидимых по- верхностей и прямая работа с ним требуется крайне редко.
    Буфер-накопитель можно применять для различных опера- ций. Более подробно работа с ним описана в разделе 7.2.
    Буфер маски используется для формирования пиксельных масок (трафаретов), служащих для вырезания из общего масси- ва тех пикселей, которые следует вывести на экран. Буфер маски и работа с ним более подробно рассмотрены в разделах 7.3, 8.2
    и 8.3.
    7.1. Смешивание изображений и прозрач- ность
    Разнообразные прозрачные объекты  стекла, прозрачная посуда и т.д. часто встречаются в реальности, поэтому важ- но уметь создавать такие объекты в интерактивной графике.
    OpenGL предоставляет программисту механизм работы с полу- прозрачными объектами, который и будет кратко описан в этом разделе.
    Прозрачность реализуется с помощью специального режи- ма смешивания цветов (blending). Алгоритм смешивания ком- бинирует цвета так называемых входящих пикселей (т.е. ѕкан- дидатовї на помещение в буфер кадра) с цветами соответству- ющих пикселей, уже хранящихся в буфере. Для смешивания используется четвертая компонента цвета  альфа-компонента,

    7.1. Смешивание изображений и прозрачность
    91
    поэтому этот режим называют еще альфа-смешиванием. Про- грамма может управлять интенсивностью альфа-компоненты точно так же, как и интенсивностью основных цветов, т.е. зада- вать значение интенсивности для каждого пикселя или каждой вершины примитива. Режим включается с помощью команды glEnable(GL_BLEND)
    Определить параметры смешивания можно с помощью ко- манды:
    void glBlendFunc (enum src ,enum dst )
    Параметр src определяет как получить коэффициент k
    1
    ис- ходного цвета пикселя, a dst задает способ получения коэффи- циента k
    2
    для цвета в буфере кадра. Для получения результи- рующего цвета используется следующая формула: res = c src
    ?
    k
    1
    + c dst
    ? k
    2
    , где c src
     цвет исходного пикселя, c dst
     цвет пиксе- ля в буфере кадра (res, k
    1
    , k
    1
    , c src
    , c dst
     четырехкомпонентные
    RGBA-векторы).
    Приведем наиболее часто используемые значения агрументов src и
    dst
    GL_SRC_ALPHA k = (A
    s
    , A
    s
    , A
    s
    , A
    s
    )
    GL_SRC_ONE_MINUS_ALPHA
    k = (1, 1, 1, 1) ? (A
    s
    , A
    s
    , A
    s
    , A
    s
    )
    GL_DST_COLOR k = (R
    d
    , G
    d
    , B
    d
    )
    GL_ONE_MINUS_DST_COLOR
    k = (1, 1, 1, 1) ? (R
    d
    , G
    d
    , B
    d
    ,
    d
    )
    GL_DST_ALPHA k = (A
    d
    , A ? d, A ? d, A
    d
    )
    GL_DST_ONE_MINUS_ALPHA
    k = (1, 1, 1, 1) ? (A
    d
    , A
    d
    , A
    d
    , A
    d
    )

    92
    Глава 7. Операции с пикселями
    GL_SRC_COLOR k = (Rs, Gs, Bs)
    GL_ONE_MINUS_SRC_COLOR
    k = (1, 1, 1, 1) ? (R
    s
    , G
    s
    , B
    s
    , A
    s
    )
    Пример: предположим, мы хотим реализовать вывод про- зрачных объектов. Коэффициент прозрачности задается альфа- компонентой цвета. Пусть 1  непрозрачный объект; 0  абсо- лютно прозрачный, т.е. невидимый. Для реализации служит сле- дующий код:
    glEnable (GL_BLEND) ;
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
    Например, полупрозрачный треугольник можно задать сле- дующим образом:
    g l C o l o r 3 f ( 1 . 0 , 0 . 0 , 0 . 0 , 0 . 5 ) ;
    glBegin (GL_TRIANGLES) ;
    g l V e r t e x 3 f ( 0 . 0 , 0 . 0 , 0 . 0 ) ;
    g l V e r t e x 3 f ( 1 . 0 , 0 . 0 , 0 . 0 ) ;
    g l V e r t e x 3 f ( 1 . 0 , 1 . 0 , 0 . 0 ) ;
    glEnd ( ) ;
    Если в сцене есть несколько прозрачных объектов, которые могут перекрывать друг друга, корректный вывод можно гаран- тировать только в случае выполнения следующих условий:
    € все прозрачные объекты выводятся после непрозрачных;
    € при выводе объекты с прозрачностью должны быть упоря- дочены по уменьшению глубины, т.е. выводиться, начиная с наиболее отдаленных от наблюдателя.
    В OpenGL команды обрабатываются в порядке их поступ- ления, поэтому для реализации перечисленных требований до- статочно расставить в соответствующем порядке вызовы команд glVertex
    , но и это в общем случае нетривиально.

    7.2. Буфер-накопитель
    93 7.2. Буфер-накопитель
    Буфер-накопитель (accumulation buer)  это один из допол- нительных буферов OpenGL. В нем можно сохранять визуализи- рованное изображение, применяя при этом попиксельно специ- альные операции. Буфер-накопитель широко используется для создания различных спецэффектов.
    Изображение берется из буфера, выбранного на чтение ко- мандой void glReadBuffer (enum buf )
    Аргумент buf определяет буфер для чтения. Значения buf
    ,
    равные
    GL_BACK
    ,
    GL_FRONT
    , определяют соответствующие буферы цвета для чтения.
    GL_BACK
    задает в качестве источни- ка пикселей внеэкранный буфер;
    GL_FRONT
     текущее содер- жимое окна вывода. Команда имеет значение, если используется дублирующая буферизация. В противном случае используется только один буфер, соответствующий окну вывода (строго гово- ря, OpenGL имеет набор дополнительных буферов, используе- мых, в частности, для работы со стереоизображениями, но здесь мы их рассматривать не будем).
    Буфер-накопитель является дополнительным буфером цвета.
    Он не используется непосредственно для вывода образов, но они добавляются в него после вывода в один из буферов цвета. При- меняя различные операции, описанные ниже, можно понемногу
    ѕнакапливатьї изображение в буфере.
    Затем полученное изображение переносится из буфера-нако- пителя в один из буферов цвета, выбранный на запись командой void glDrawBuffer (enum buf )
    Значение buf аналогично значению соответствующего аргу- мента в команде glReadBuer
    Все операции с буфером-накопителем контролируются ко- мандой

    94
    Глава 7. Операции с пикселями void glAccum (enum op , GLfloat value )
    Аргумент op задает операцию над пикселями и может при- нимать следующие значения:
    GL_LOAD  пиксель берется из буфера, выбранного на чте- ние, его значение умножается на value и заносится в буфер- накопитель;
    GL_ACCUM  аналогично предыдущему, но полученное по- сле умножения значение складывается с уже имеющимся в буфере;
    GL_MULT  эта операция умножает значение каждого пик- селя в буфере накопления на value;
    GL_ADD  аналогично предыдущему, только вместо умноже- ния используется сложение;
    GL_RETURN  Изображение переносится из буфера нако- пителя в буфер, выбранный для записи. Перед этим значе- ние каждого пикселя умножается на value.
    Следует отметить, что для использования буфера-накопите- ля нет необходимости вызывать какие-либо команды glEnable
    Достаточно инициализировать только сам буфер.
    Пример использования буфера-накопителя для устранения погрешностей растеризации (ступенчатости) приведен в разде- ле 8.1.
    7.3. Буфер маски
    При выводе пикселей в буфер кадра иногда возникает необхо- димость выводить не все пиксели, а только некоторое подмноже- ство, т.е. наложить трафарет (маску) на изображение. Для это- го OpenGL предоставляет так называемый буфер маски (stencil

    7.3. Буфер маски
    95
    buer). Кроме наложения маски, этот буфер предоставляет еще несколько интересных возможностей.
    Прежде чем поместить пиксель в буфер кадра, механизм ви- зуализации OpenGL позволяет выполнить сравнение (тест) меж- ду заданным значением и значением в буфере маски. Если тест проходит, пиксель рисуется в буфере кадра.
    Механизм сравнения весьма гибок и контролируется следую- щими командами:
    void g l S t e n c i l F u n c (enum func , int r e f , uint mask )
    void glStencilOp (enum s f a i l , enum d p f a i l ,
    enum dppass )
    Аргумент ref команды glStencilFunc задает значение для срав- нения. Он должен принимать значение от 0 до 2s ? 1, где s 
    число бит на точку в буфере маски.
    С помощью аргумента func задается функция сравнения. Он может принимать следующие значения:
    GL_NEVER  тест никогда не проходит, т.е. всегда возвра- щает false;
    GL_ALWAYS  тест проходит всегда;
    GL_LESS, GL_LEQUAL, GL_EQUAL
    GL_GEQUAL, GL_GREATE, GL_NOTEQUAL  тест проходит в случае, если ref соответственно меньше значе- ния в буфере маски, меньше либо равен, равен, больше,
    больше либо равен, или не равен.
    Аргумент mask задает маску для значений. Т.е. в итоге для этого теста получаем следующую формулу: ((ref AND mask) op
    (svalue AND mask)).
    Команда glStencilOp предназначена для определения действий над пикселем буфера маски в случае положительного или отри- цательного результата теста.

    96
    Глава 7. Операции с пикселями
    Аргумент sfail задает действие в случае отрицательного ре- зультата теста, и может принимать следующие значения:
    GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR
    GL_DECR, GL_INVERT  соответственно сохраняет зна- чение в буфере маски, обнуляет его, заменяет на заданное значение (
    ref
    ), увеличивает, уменьшает или побитово ин- вертирует.
    Аргументы dpfail определяют действия в случае отрицатель- ного результата теста на глубину в z-буфере, а dppass задает действие в случае положительного результата этого теста. Ар- гументы принимают те же значения, что и аргумент sfail. По умолчанию все три параметра установлены на GL_KEEP.
    Для включения маскирования необходимо выполнить коман- ду glEnable(GL_STENCIL_TEST)
    ;
    Буфер маски используется при создании таких спецэффек- тов, как падающие тени, отражения, плавные переходы из одной картинки в другую и пр.
    Пример использования буфера маски при построении теней и отражений приведен в разделах 8.2 и 8.3.
    7.4. Управление растеризацией
    Способ выполнения растеризации примитивов можно частич- но регулировать командой glHint (target, mode)
    , где target  вид контролируемых действий, принимающий одно из следующих значений:
    GL_FOG_HINT  точность вычислений при наложении ту- мана. Вычисления могут выполняться по пикселям (наи- большая точность) или только в вершинах. Если реализа- ция OpenGL не поддерживает попиксельного вычисления,
    то выполняется только вычисление по вершинам;

    7.4. Управление растеризацией
    97
    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()

    98
    Глава 7. Операции с пикселями
    7.5. Контрольные вопросы

    1   2   3   4   5   6   7   8   9


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