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

  • Е. А. СНИЖКО, Н. А. ФЛЕРОВА, А. В. ВОРОНЦОВ

  • УДК 681.3.06 (075) Р е ц е н з е н т

  • Лабораторная работа № 1. Подключение библиотек; контекст устройства, контекст воспроизведения; общий вид программы. Цель работы.

  • Необходимые теоретические сведения.

  • Основные понятия, используемые в данной лабораторной работе

  • Порядок выполнения работы.

  • GetClientRect

  • WM_DESTROY

  • WM_KEYDOWN

  • LOWORD(lParam)

  • CS_HREDRAW

  • Metodichka по компьютерной графике. Е. А. Снижко, Н. А. Флерова, А. В. Воронцов программирование компьютерной графики с использованием


    Скачать 1.31 Mb.
    НазваниеЕ. А. Снижко, Н. А. Флерова, А. В. Воронцов программирование компьютерной графики с использованием
    Дата16.12.2018
    Размер1.31 Mb.
    Формат файлаpdf
    Имя файлаMetodichka по компьютерной графике.pdf
    ТипПрактикум
    #60396
    страница1 из 8
      1   2   3   4   5   6   7   8

    1
    Министерство образования и науки Российской Федерации
    Балтийский государственный технический университет "Военмех"
    Институт систем управления и управляющих систем
    Кафедра информационных систем и компьютерных технологий
    Е. А. СНИЖКО, Н. А. ФЛЕРОВА, А. В. ВОРОНЦОВ
    ПРОГРАММИРОВАНИЕ КОМПЬЮТЕРНОЙ
    ГРАФИКИ С ИСПОЛЬЗОВАНИЕМ
    БИБЛИОТЕКИ OPENGL
    Лабораторный практикум
    Санкт-Петербург
    2005

    2
    УДК 681.3.06 (075)
    Снижко, Е.А.
    Программирование компьютерной графики с использованием библиотеки openGL: Лабораторный практикум / Е.А.Снижко, Н.А.Флерова, А.В.Воронцов; Балт. гос. техн. ун-т. – СПб., 2005. с.
    Приведено описание комплекса лабораторных работ по курсу
    «Компьютерная графика» для студентов специальности 220200. В лабораторных работах практикума упор делается на программную генерацию изображений средствами кроссплатформенной графической библиотеки openGL. Описание лабораторных работ содержит необходимый справочный материал, связанный с использованием библиотеки.
    Для студентов, имеющих навыки программирования на C++ или
    Delphi.
    УДК 681.3.06 (075)
    Р е ц е н з е н т : к а н д . пед. наук, доцент каф. информатики и ВТ
    Тульского гос. пед. ун-та Ю. М. Мартынюк.
    Утверждено
    редакционно-издательским
    советом университета
    © Авторы, 2005
    © БГТУ, 2005

    3
    Предисловие
    Практикум содержит семь лабораторных работ, отражающих основные возможности программирования графики с использованием кроссплатформенной библиотеки OpenGL.
    Данное пособие предназначено для студентов, изучающих программирование, для которых знание возможностей современных графических библиотек является необходимым компонентом профессиональных знаний.
    В настоящее время наиболее известными и широко распространенными являются графические библиотеки DirectX и OpenGL. Первая библиотека является внутренним стандартом фирмы Microsoft и сильно привязана к операционной системе Windows.
    Библиотека OpenGL в настоящее время является открытым международным стандартом.
    Именно по этой причине ей отдано предпочтение при составлении данного практикума.
    Теоретические сведения, относящиеся к алгоритмическому аспекту графического вывода, отражены в конспекте лекций по дисциплине «Компьютерная геометрия и графика» и в практикуме не рассматриваются. В указаниях к лабораторным работам имеются ссылки на лекции, содержащиеся в конспекте, а также на дополнительные источники информации по данной теме.
    Для выполнения лабораторных работ практикума студенты должны иметь навыки программирования на языке C++, а также первоначальные знания об операционной системе Windows и особенностях программирования под Windows. Хотя библиотека
    OpenGL является кроссплатформенной, т.е. не зависит от операционной системы, в работах предусматривается использовать возможности именно операционной системы
    Windows, поскольку в данный момент она является наиболее распространенной операционной системой.
    Все задания практикума могут быть выполнены также на основе среды визуального программирования Delphi. Некоторые отличия в синтаксисе отдельных команд комментируются в тексте соответствующими сносками. В Приложении 1 приведен код минимальной программы с использованием библиотеки OpenGL на языке
    C++; Приложение 2 содержиттри варианта кодов минимальной программы на Delphi.
    Каждая лабораторная работа содержит набор обязательных и дополнительных заданий. Обязательные задания выполняются в соответствии с вариантом.
    Дополнительные задачи могут быть предложены преподавателем в индивидуальном порядке.
    При защите лабораторной работы студенты должны предоставить работоспособные программы по каждому заданию данной лабораторной работы, отчет, содержащий исходные коды разработанных программ и ответы на контрольные вопросы.

    4
    Лабораторная работа № 1. Подключение библиотек; контекст
    устройства, контекст воспроизведения; общий вид программы.
    Цель работы.
    Создание программы-заготовки для работы с библиотекой openGL.
    Необходимые теоретические сведения.
    Использование библиотеки OpenGL требует навыков программирования на C++, а также знания основ событийного программирования на уровне операционной системы
    Windows
    1
    Для выполнения работы необходимо иметь представление об основных принципах формирования изображения на экране, о современных стандартах и интерфейсах программирования компьютерной графики ([7] – лекция 17), знать особенности представления цвета в цветовой модели RGB ([7] – лекция 4).
    Основные понятия, используемые в данной лабораторной работе: контекст устройства, контекст воспроизведения, формат пиксела.
    Контекст графического устройства (Device Context) указывает плоскость отображения, на которую осуществляется графический вывод: окно программы на экране дисплея, страница принтера или другое место, куда может быть направлен графический вывод. Если программа вызывает различные графические функции, такие как рисование точек, линий, фигур и др., необходимо указывать идентификатор контекста (hdc – handle of device context) и координаты. Смысл использования контекста устройства заключается в том, что вывод на различные устройства осуществляется одними и теми же функциями, изменяется лишь значение hDC. «Контекст устройства является структурой, которая определяет комплект графических объектов и связанных с ними атрибутов и графические режимы, влияющие на вывод». При составлении программы необходимо получить это числовое значение перед рисованием, а после рисования – освободить контекст.
    В OpenGL существует понятие контекст воспроизведения (контекст рендеринга), аналогичное понятию контекст устройства. Графическая система OpenGL также нуждается в ссылке на устройство, на которое будет осуществляться вывод. Это специальная ссылка на контекст воспроизведения – величина типа HGLRC (handle openGL rendering context, ссылка на контекст воспроизведения OpenGL) - hRC.
    Прежде чем получить контекст воспроизведения, сервер OpenGL должен получить детальные характеристики используемого оборудования. Эти характеристики хранятся в специальной структуре – описание формата пиксела. Формат пиксела определяет конфигурацию буфера цвета и вспомогательных буферов.
    Порядок выполнения работы.
    Программа, которая будет создана в результате выполнения данной лабораторной работы, должна осуществлять следующие действия: создавать пустое окно для графического вывода средствами openGL; устанавливать все необходимые параметры графического вывода; реагировать на нажатие клавиши для закрытия окна и завершения работы. Для демонстрации графического вывода в конце лабораторной работы в окне будет построено некоторое изображение. Созданная в ходе выполнения лабораторной работы программа будет являться основой для выполнения всех последующих работ.
    1.
    Создайте новое приложение в Visual C++.
    2.
    Добавьте для сборки проекта библиотеки OpenGL. Для этого:

    в меню Project/setting, выберите закладку LINK;
    1
    Лабораторные работы практикума могут выполняться в среде визуального программирования Delphi. В
    Приложении 2 содержатся варианты минимальной программы OpenGL на Delphi.

    5

    в строке "Object/Library Modules" добавьте строку "OpenGL32.lib GLu32.lib GLaux.lib"

    для завершения щелкните левой клавишей мыши по кнопке OK.
    3.
    Введите в текст кода следующие строки (они сообщают компилятору какие библиотечные файлы следует использовать):
    #include
    // Заголовочный файл для Windows
    #include
    // Заголовочный файл для библиотеки OpenGL32
    #include
    // Заголовочный файл для библиотеки GLu32
    #include
    // Заголовочный файл для библиотеки GLaux
    4.
    Инициализируйте все переменные, которые будут использованы в программе.
    Первые две строки устанавливают контекст воспроизведения (рендеринга) и контекст устройства. Контекст рендеринга OpenGL определен как hRC и связывает вызовы OpenGL с окном Windows. Для того чтобы рисовать в окне, необходимо создать контекст устройства Windows, который определен как hDC.
    Контекст устройства связывает окно с GDI. Контекст воспроизведения связывает
    OpenGL с контекстом устройства. static HGLRC hRC;
    // Постоянный контекст рендеринга static HDC hDC;
    // Приватный контекст устройства GDI
    5.
    Объявите массив для отслеживания нажатия клавиш на клавиатуре (указанный ниже способ позволяет отслеживать нажатие нескольких клавиш одновременно).
    BOOL keys[256];
    // Массив для процедуры обработки клавиатуры
    6.
    В следующей секции кода будут произведены все настройки для OpenGL Эта процедура может быть вызвана только после того как будет создано окно OpenGL.
    Установим цвет, которым будет очищен экран. Все значения могут быть в диапазоне от 0.0f до 1.0f, при этом 0.0 самый темный, а 1.0 самый светлый. Первые три параметра определяют цвет в модели RGB: первый - интенсивность красного, второй – зеленого, третий – синего. Наибольшее значение – 1.0f, является самым ярким значением данного цвета. Последний параметр – альфа-значение
    (прозрачность) – пока будет равен 0.0f.
    GLvoid InitGL(GLsizei Width, GLsizei Height) //Вызвать после создания окна GL
    { glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    // Очистка экрана в черный цвет
    }
    7.
    Следующая секция кода – функция масштабирования сцены, вызываемая OpenGL всякий раз, когда изменяется размер окна. Даже если размеры окна не изменяются (например, в полноэкранном режиме), эта процедура все равно должна быть вызвана хотя бы один раз (обычно во время запуска программы), т.к. сцена масштабируется, основываясь на ширине и высоте отображаемого окна.
    GLvoid ReSizeGLScene(GLsizei Width, GLsizei Height)
    { if (Height==0)
    // Предотвращение деления на ноль,
    //если окно слишком мало
    Height=1; glViewport(0, 0, Width, Height);
    // Сброс текущей области вывода и перспективных преобразований
    }
    8.
    Следующая секция предназначена для рисования сцены. Впоследствии код будет добавляться именно в эту секцию программы. Пока запишем в этой секции только команду для очистки экрана цветом, который мы определили выше. Команды рисования будут следовать за ней.
    GLvoid DrawGLScene(GLvoid)
    { glClear(GL_COLOR_BUFFER_BIT); // очистка экрана
    }

    6 9.
    Одна из важнейших секций кода устанавливает параметры окна Windows, формат пикселя, обрабатывает сообщения при изменении размеров окна, при нажатии на клавиши, и закрытии программы.
    Первые четыре строки делают следующее: переменная hWnd – является указателем на окно. Переменная message – сообщения, передаваемые программе системой. Переменные
    wParam и lParam содержат информацию, которая посылается вместе с сообщением, например такую как ширина и высота окна.
    LRESULT CALLBACK WndProc(
    HWND hWnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam)
    Код между скобками устанавливает формат пикселей. Формат пикселя определяет то, как
    OpenGL будет выводить в окно. Большая часть кода игнорируется, но тем не менее необходима.
    {
    RECT
    Screen;
    // используется позднее для размеров окна
    GLuint PixelFormat; static PIXELFORMATDESCRIPTOR pfd=
    { sizeof(PIXELFORMATDESCRIPTOR), // Размер этой структуры
    1,
    // Номер версии
    PFD_DRAW_TO_WINDOW |
    // Формат для Окна
    PFD_SUPPORT_OPENGL |
    // Формат для OpenGL
    PFD_DOUBLEBUFFER,
    // Формат для двойного буфера
    PFD_TYPE_RGBA,
    // Требуется RGBA формат
    16,
    // Выбор 16 бит глубины цвета
    0, 0, 0, 0, 0, 0,
    // Игнорирование цветовых битов
    0,
    // нет буфера прозрачности
    0,
    // Сдвиговый бит игнорируется
    0,
    // Нет буфера аккумуляции
    0, 0, 0, 0,
    // Биты аккумуляции игнорируются
    16,
    // 16 битный Z-буфер (буфер глубины)
    0,
    // Нет буфера трафарета
    0,
    // Нет вспомогательных буферов
    PFD_MAIN_PLANE,
    // Главный слой рисования
    0,
    // Резерв
    0, 0, 0
    // Маски слоя игнорируются
    };
    Следующая секция предназначена для обработки системных сообщений: выход из программы, нажатие клавиш, перемещение окна и т.д., каждая секция "case" обрабатывает свой тип сообщения. switch (message)
    // Тип сообщения
    {
    WM_CREATE указывает программе, что сообщение должно быть создано. Сначала следует запросить DC (контекст устройства) для окна – без него рисование в окне невозможно. Затем запрашивается формат пикселя. Компьютер будет выбирать формат, который полностью совпадает или наиболее близок к запрашиваемому формату
    2
    case WM_CREATE: hDC = GetDC(hWnd); // Получить контекст устройства для окна
    PixelFormat = ChoosePixelFormat(hDC, &pfd);
    // Найти ближайшее совпадение для формата пикселов
    Если подходящий формат пикселя не найден, будет выведено сообщение об ошибке. if (!PixelFormat)
    {
    MessageBox(0,
    "Не найден подходящий формат пиксела.",
    "Ошибка",MB_OK|MB_ICONERROR);
    3 2
    В программе на C++ указатель записан в виде &pfd, в программе на Delphi следует записать @pfd.
    3
    В Delphi вместо символа «|» используется «or».

    7
    PostQuitMessage(0);
    // Это сообщение говорит, что программа должна завершится break; // Предтовращение повтора кода
    }
    Если подходящий формат найден, компьютер будет пытаться установить формат пиксела для контекста устройства. Если формат пикселя не может быть установлен по какой-то причине, появится сообщение об ошибке, что формат пикселя не установлен. if(!SetPixelFormat(hDC,PixelFormat,&pfd))
    {
    MessageBox(0,"Формат пиксела не установлен.",
    "Ошибка",MB_OK|MB_ICONERROR);
    PostQuitMessage(0); break;
    }
    Если код записан, как показано выше, будет создан контекст устройства(DC), и установлен подходящий формат пикселя.
    Далее следует создать Контекст Рендеринга (RC), для этого OpenGL использует DC.
    Функция wglCreateContext захватывает Контекст Рендеринга и сохраняет его в переменной hRC. Если по какой-то причине Контекст Рендеринга недоступен, должно появиться сообщение об ошибке. hRC = wglCreateContext(hDC); if(!hRC)
    {
    MessageBox(0,"Контекст воспроизведения не создан.",
    "Ошибка",MB_OK|MB_ICONERROR);
    PostQuitMessage(0); break;
    }
    Необходимо сделать активным Контекст Рендеринга, для того чтобы можно было рисовать в окне средствами OpenGL. Если по какой-либо причине это невозможно, должно появиться сообщение об ошибке. if(!wglMakeCurrent(hDC, hRC))
    {
    MessageBox(0,"Невозможно активизировать GLRC.",
    "Ошибка",MB_OK|MB_ICONERROR);
    PostQuitMessage(0); break;
    }
    10.
    Создадим область рисования OpenGL. С помощью функции GetClientRect можно определить ширину и высоту окна. После того как ширина и высота окна получены, инициализируем экран OpenGL. Это достигается при помощи вызова функции InitGL с шириной и высотой окна в качестве параметров.
    GetClientRect(hWnd, &Screen);
    InitGL(Screen.right, Screen.bottom); break;
    11.
    Следующий фрагмент кода необходим для уничтожения окна. Он использует сообщения WM_DESTROY и WM_CLOSE. Программа будет посылать это сообщение при выходе из программы по нажатию ALT-F4 или при ошибке
    (PostQuitMessage(0)).
    Функция ChangeDisplaySettings(NULL,0) восстанавливает разрешение рабочего стола
    (делая его таким, каким оно было до перехода в полноэкранный режим).
    Функция ReleaseDC(hWnd,hDC) уничтожает контекст устройства окна.
    Перечисленные действия уничтожают окно OpenGL. case WM_DESTROY: case WM_CLOSE:
    ChangeDisplaySettings(NULL, 0); wglMakeCurrent(hDC,NULL); wglDeleteContext(hRC);
    ReleaseDC(hWnd,hDC);

    8
    PostQuitMessage(0); break;
    12.
    Опишем обработку сообщений, возникающих при нажатии клавиш.
    Сообщение WM_KEYDOWN возникает всякий раз при нажатии клавиши. Клавиша, которая была нажата, сохраняется в переменной wParam. При нажатии клавиши элемент массива, соответствующий коду нажатой клавиши, принимает значение TRUE. case WM_KEYDOWN: keys[wParam] = TRUE; break;
    Сообщение WM_KEYUP вызывается всякий раз при отпускании клавиши. Клавиша, которая отжата, также сохраняется в переменной wParam. При отпускании клавиши соответствующий элемент массива принимает значение FALSE. case WM_KEYUP: keys[wParam] = FALSE; break;
    13.
    В завершении программы следует обработать изменение размеров окна. Даже при запуске программы в полноэкранном режиме этот код необходим, без него экран
    OpenGL не появится.
    Всякий раз сообщение WM_SIZE посылается Windows с двумя параметрами - новая ширина, и новая высота экрана. Эти параметры сохранены в LOWORD(lParam) и
    HIWORD(lParam). Вызов функции ReSizeGLScene изменяет размеры экрана, т.е. передает высоту и ширину в эту секцию кода. case WM_SIZE:
    ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); break;
    Следующий код необходим для обработки Windows всех поступивших сообщений и завершения процедуры. default: return (DefWindowProc(hWnd, message, wParam, lParam));
    } return (0);
    }
    14.
    Следующая процедура необходима для создания и регистрации окна Windows. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,int nCmdShow)
    {
    MSG msg;
    // Структура сообщения Windows
    WNDCLASS wc; // Структура класса Windows для установки типа окна
    HWND hWnd; // Сохранение дескриптора окна
    Флаги стиля CS_HREDRAW и CS_VREDRAW служат для перерисовки окна при его перемещении. CS_OWNDC создает скрытый DC для окна, т.е. DC не может использоваться совместно нескольким приложениями. WndProc - процедура, которая перехватывает сообщения для программы. Свойство
      1   2   3   4   5   6   7   8


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