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

  • 3.2.1.

  • 3.2.2.

  • 3.2.3.

  • GL POINTS

  • GL LINE STRIP

  • GL TRIANGLES

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


    Скачать 0.66 Mb.
    НазваниеРуководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
    Дата21.10.2022
    Размер0.66 Mb.
    Формат файлаdocx
    Имя файла221937-83556.docx
    ТипРуководство
    #747097
    страница5 из 30
    1   2   3   4   5   6   7   8   9   ...   30
    36

    Глава 2. Введение в OPENGL

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

    Следующая последовательность команд из функции Display():

    glClearColor (0, 0, 0, 1); glClear (GL_COLOR_BUFFER_BrT);

    glColor3ub (255 ,0 ,0); glBegin(GL_QUADS);

    glVertex2f (left , bottom ) ;

    glVertex2f (left , top );

    glVertex2f( right , top );

    glVertex2f( right , bottom ) ; glEnd();

    очищает окно и выводит на экран квадрат, задавая координаты четырех угловых вершин и цвет.

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

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

    1. В чем, по вашему мнению, заключается необходимость со­здания стандартной графической библиотеки?

    2. Кратко опишите архитектуру библиотек OpenGL и органи­зацию конвейера.

    3. В чем заключаются функции библиотек, подобных GLUT или GLX? Почему они формально не входят в OpenGL?

    4. Назовите категории команд (функций) библиотеки.

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

    37

    1. Почему организацию OpenGL часто сравнивают с конеч­ным автоматом?

    2. Зачем нужны различные варианты команд OpenGL, отли­чающиеся только типами параметров?

    7)

    Что можно сказать о количестве и типе параметров коман­ды glColor4ub()? glVertex3fv()?


    Глава 3.

    Рисование геометрических объектов

    3.1. Процесс обновления изображения

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

    Обычно приложение OpenGL в бесконечном цикле вызывает функцию обновления изображения в окне. В этой функции и сосредоточены вызовы основных команд OpenGL. Если исполь­зуется библиотека GLUT, то это будет функция с обратным вы­зовом, зарегистрированная с помощью вызова glutDisplayFuncQ. GLUT вызывает эту функцию, когда операционная система ин­формирует приложение о том, что содержимое окна необходимо перерисовать (например, если окно было перекрыто другим). Создаваемое изображение может быть как статичным, так и анимированным, т.е. зависеть от каких-либо параметров, изме­няющихся со временем. В этом случае лучше вызывать функ-

    39

    40

    Глава 3. Рисование геометрических объектов

    цию обновления самостоятельно. Например, с помощью коман­ды glutPostRedisplay(). За более подробной информацией можно обратиться к главе 10.

    Приступим, наконец, к тому, чем занимается типичная функ­ция обновления изображения. Как правило, она состоит из трех шагов:

    • очистка буферов OpenGL;

    • установка положения наблюдателя;

    • преобразование и рисование геометрических объектов.

    Очистка буферов производится с помощью команды:

    void glClearColor ( clampf r, clampf g, clampf b,

    clampf a ) void glClear ( bitfield buf)

    Команда glClearColor устанавливает цвет, которым будет за­полнен буфер кадра. Первые три параметра команды задают R,G и В компоненты цвета и должны принадлежать отрезку [0,1]. Четвертый параметр задает так называемую альфа ком­поненту (см. п. 7.1). Как правило, он равен 1. По умолчанию цвет —черный (0,0,0,1).

    Команда glClear очищает буферы, а параметр buf определя­ет комбинацию констант, соответствующую буферам, которые нужно очистить (см. главу 7). Типичная программа вызывает команду

    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_B]T)

    для очистки буферов цвета и глубины.

    Установка положения наблюдателя и преобразования трех­мерных объектов (поворот, сдвиг и т.д.) контролируются с помо­щью задания матриц преобразования. Преобразования объектов и настройка положения виртуальной камеры описаны в главе 4.

    3.2. Вершины и примитивы

    41

    Сейчас сосредоточимся на том, как передать в OpenGL опи­сания объектов, находящихся в сцене. Каждый объект является набором примитивов OpenGL.

    3.2. Вершины и примитивы

    В OpenGL вершина (vertex) является атомарным графиче­ским примитивом и определяет точку, конец отрезка, угол мно­гоугольника и т.д. Все остальные примитивы формируются с помощью задания вершин, входящих в данный примитив. На­пример, отрезок определяется двумя вершинами, являющимися концами отрезка.

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

    3.2.1. Положение вершины в пространстве

    Положение вершины определяются заданием ее координат в двух-, трех-, или четырехмерном пространстве (однородные ко­ординаты). Это реализуется с помощью нескольких вариантов команды glVertex:

    void glVertex[2 3 4][s i f d] (type coords) void glVertex[2 3 4][s i f d]v (type *coords)

    Каждая команда задает четыре координаты вершины: х, у, z, w. Команда glVertex2* получает значения х и у. Координата z в таком случае устанавливается по умолчанию равной 0, ко­ордината w — равной 1. glVertex3* получает координаты х, у, z и заносит в координату w значение 1. glVertex4* позволяет задать все четыре координаты.

    Для ассоциации с вершинами цветов, нормалей и текстур­ных координат используются текущие значения соответствую­щих данных, что отвечает организации OpenGL как конечного

    42 Глава 3. Рисование геометрических объектов

    автомата. Эти значения могут быть изменены в любой момент с помощью вызова соответствующих команд.

    3.2.2. Цвет вершины

    Для задания текущего цвета вершины используются коман­ды

    void glColor[3 4][b s i f] (GLtype components) void glColor[3 4][b s i f]v (GLtype components)

    Первые три параметра задают R, G, В компоненты цвета, а последний параметр определяет коэффициент непрозрачности (так называемая альфа-компонента). Если в названии команды указан тип «f» (float), то значения всех параметров должны при­надлежать отрезку [0,1], при этом по умолчанию значение аль­фа-компоненты устанавливается равным 1.0, что соответствует полной непрозрачности. Тип «ub» (unsigned byte) подразумевает, что значения должны лежать в отрезке [0,255].

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

    Для управления режимом интерполяции используется ко­манда

    void glShadeModel (GLenum mode)

    вызов которой с параметром GL_SMOOTH включает интерполя­цию (установка по умолчанию), а с GL_FLAT — отключает.

    3.2.3. Нормаль

    Определить нормаль в вершине можно, используя команды

    void glNormal3[b s i f d] (type coords) void glNorma!3[b s i f d]v (type coords)

    3.3. Операторные скобки GLBEGIN / GLEND

    43

    Для правильного расчета освещения необходимо, чтобы век­тор нормали имел единичную длину. В OpenGL существует специальный режим, при котором задаваемые нормали будут нормироваться автоматически. Его можно включить командой glEnable(GL_NORMALIZE).

    Режим автоматической нормализации должен быть включен, если приложение использует модельные преобразования растя­жения/сжатия, так как в этом случае длина нормалей изменя­ется при умножении на модельно-видовую матрицу.

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

    Отмстим, что команды

    void glEnable (GLenum mode) void glDisable (GLenum mode)

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

    3.3. Операторные скобки glBegin / glEnd

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

    44 Глава 3. Рисование геометрических объектов

    void glBegin (GLenum mode) void glEnd (void)

    Параметр mode определяет тип примитива, который задается внутри и может принимать следующие значения:

    GL POINTS —каждая вершина задает координаты некото­рой точки.

    GL LINES —каждая отдельная пара вершин определяет от­резок; если задано нечетное число вершин, то последняя вершина игнорируется.

    GL LINE STRIP — каждая следующая вершина задает от­резок вместе с предыдущей.

    GL LINE LOOP —отличие от предыдущего примитива толь­ко в том, что последний отрезок определяется последней и первой вершиной, образуя замкнутую ломаную.

    GL TRIANGLES — каждые отдельные три вершины опреде­ляют треугольник; если задано не кратное трем число вер­шин, то последние вершины игнорируются.

    1   2   3   4   5   6   7   8   9   ...   30


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