Программирование компьютерной графики с использовани­ ем библиотеки OpenGL.

139 99 753KB

Russian Pages [44] Year 2022

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

Программирование компьютерной графики с использовани­ ем библиотеки OpenGL.

Citation preview

Р.Ф. Марданов

ПРОГРАММИРОВАНИЕ КОМПЬЮТЕРНОЙ ГРАФИКИ С ИСПОЛЬЗОВАНИЕМ БИБЛИОТЕКИ OpenGL Учебное пособие

КАЗАНЬ – 2022

Казанский федеральный университет Институт математики и механики им. Н.И. Лобачевского

Кафедра аэрогидромеханики

Р.Ф. Марданов

ПРОГРАММИРОВАНИЕ КОМПЬЮТЕРНОЙ ГРАФИКИ С ИСПОЛЬЗОВАНИЕМ БИБЛИОТЕКИ OpenGL

КАЗАНЬ – 2022

УДК 519.6

Публикуется по рекомендации Учебно-методической комиссии Института математики и механики КФУ Протокол № 5 от 10 марта 2022 г. Рецензент кандидат физико-математических наук доцент кафедры интеллектуальных технологий поиска ИТИС КФУ Е.К. Липачев

Марданов Р.Ф. Программирование компьютерной графики с использовани­ ем библиотеки OpenGL. Учебное пособие / Р.Ф. Марданов. – Казань: Казан. ун-т, 2022. – 43 с. Учебное пособие основано на курсе лекций и практических занятиях по дисциплине “Компьютерный практикум по механике” для студентов старших курсов и магистров Института математики и механики КФУ. В нем описаны основные алгоритмы для создания программ визуали­ зации трехмерной компьютерной графики с использованием библиоте­ ки OpenGL на языке C# в среде программирования Microsoft Visual Studio. Пособие рассчитано на неподготовленных обучающихся, владею­ щих минимальными знаниями и навыками программирования на языке C#. Изложенный материал может быть полезен так же студентам фи­ зико-математического и инженерного направления, аспирантам, научным работникам и инженерам при решении различных задач трехмерного про­ ектирования и моделирования.

©Марданов Р.Ф., 2022 ©Казанский университет, 2022

Содержание 1 Введение в компьютерную графику OpenGL . . . . . . . . . . . . . . 4 2 Программирование OpenGL под Windows в Visual C# . . . . 5 3 Синтаксис операторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 4 Системы координат . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 5 Графические примитивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 6 Текстуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 7 Вывод текста . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 8 Прозрачность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 9 Освещение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Рекомендуемая литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

3

1

Введение в компьютерную графику OpenGL Визуальное представление информации значительно упрощает ее вос­

приятие, обобщение и анализ. Поэтому компьютерная графика находит практическое применение в различных прикладных программах, напри­ мер, в системах автоматизированного проектирования, программ для ме­ дицинских исследований (компьютерная томография, УЗИ и т.п.), геоин­ формационных системах, программах визуализации результатов научных исследований и т.д. В связи с этим владение программными средствами для компьютерной визуализации данных представляется важным прак­ тическим навыком программиста. Одним из важных разделов компьютерной графики является трех­ мерная компьютерная графика. Для трехмерной графики в настоящий момент наиболее распространены две библиотеки: OpenGL и Direct3D, входящая в состав DirectX. Возможностями эти библиотеки обладают при­ мерно одинаковыми, а по поводу сложности их освоения мнения програм­ мистов расходятся. Основные особенности этих библиотек представлены в таблице 1. В рамках настоящего курса будет изучаться программирование 3D графики под Windows с использованием библиотеки OpenGL. Таблица 1. Особенности библиотек Direct3D и OpenGL Direct3D

OpenGL

только под Windows

кроссплатформенная (Windows, Linux, Mac OS и т.д.)

объектно

ориентированный процедурный подход

подход

4

OpenGL – Open Graphics Library. В качестве основы для нее взята библиотека IRIS GL компании Silicon Graphics, специализировавшейся на программных и аппаратных решениях для задач компьютерной графики на заре ее развития. Авторы библиотеки OpenGL 1.0: Курт Экелей (Kurt Akeley) и Марк Сегал (Mark Segal). Начиная с версии Win95 библиотека OpenGL входит в состав операционной системы Windows. Ее реализация содержится в двух системных файлах: OpenGL32.dll и glu32.dll. Для написания программ с использованием OpenGL будем использо­ вать язык Visual C# и программную среду Microsoft Visual Studio.

2

Программирование OpenGL под Windows в Visual C# Прямой поддержки OpenGL в .Net Framework, на которой основан

язык Visual C#, нет. Поэтому будем для этого использовать свободно распространяемую библиотеку Tao Framework с открытым кодом. Устано­ вочный файл этой библиотеки можно скачать с официальной страницы в интернете. https://sourceforge.net/projects/taoframework/ Последовательность действий при создании приложения для работы с OpenGL через библиотеку Tao Framework следующая. После запуска MS Visual Studio создаем новый проект, последова­ тельно выбирая: Visual C# → Windows → Приложение Windows Forms (Windows Forms Application). Подключаем к проекту библиотеки Tao. Для этого: • В Обозревателе решений (Solution Explorer) находим строку “Ссыл­ ки (References)”. Вызываем контекстное меню, нажав на ней правой кнопкой мыши, и выбираем пункт “Добавить ссылку (Add Link)”. 5

• В появившемся окне менеджера ссылок нажимаем кнопку “Обзор... (Browse...)” и в открывшемся диалоговом окне находим папку, куда были установлены библиотеки Tao (по умолчанию это C:\Program Files\TaoFramework). • Затем в дочерней папке Bin выбираем файлы Tao.OpenGL.dll и Tao.Platform.Windows.dll и нажимаем “Добавить (Add)”. • Закрываем менеджер ссылок нажатием кнопки “Ok”. В основном исполняемом файле проекта (по умолчанию это Form1.cs) сверху добавляем (комментарии здесь и в дальнейшем написаны для по­ яснения кода и их можно опустить). using Tao.OpenGl; //для работы с библиотекой OpenGL using Tao.Platform.Windows; //для реализации взаимодействия //OpenGL и платформы Windows using System.Runtime.InteropServices; //для использования //дополнительных API функций Windows Из пространства имен Tao.OpenGL будем использовать классы: Gl – интерфейс библиотеки OpenGL 2.1 из файла OpenGL32.dll; Glu – интерфейс библиотеки GLU 1.3 из файла glu32.dll. Из пространства имен Tao.Platform.Windows будем использовать клас­ сы: Gdi – интерфейс Windows GDI API из файла gdi32.dll; Wgl – набор функций для взаимодействия OpenGL с операционной си­ стемой Windows; User – интерфейс библиотеки user32.dll. Из пространства имен System.Runtime.InteropServices будем исполь­ зовать:

6

класс Marshal – для работы с неуправляемым кодом (необходим для поддержки работы старых библиотек, написанных без использования .Net); атрибут DllImport – для загрузки функций из старых библиотек dll. Базовое понятие графики Windows Контекст устройства (Device Context (DC)) – структура, определяю­ щая комплект графических объектов и связанных с ними атрибутов для вывода графических изображений. В Windows есть специальный тип, ко­ торый определяет DC: Handle Device Context (HDC) – идентификатор или дескриптор контекста устройства. Все рисование в GDI API (программной реализации двумерной графики Windows) реализовано через HDC. В OpenGL есть аналог контекста устройства, который называется кон­ текстом воспроизведения (Rendering Context (RC)) и для работы с ним введен специальный тип HGLRC. Рисование в OpenGL происходит че­ рез контекст воспроизведения. При инициализации OpenGL под Windows необходимо произвести связывание HDC и HGLRC. Схема работы программы с использованием OpenGL под Windows 1. Выбрать визуальный компонент для рисования (форма, панель и т.п. – должен иметь свойство Handle). 2. Получить контекст устройства (HDC). 3. Установить формат пикселей. 4. Получить контекст воспроизведения (HGLRC). 5. Подготовка к рисованию. 6. Рисование средствами OpenGL. 7. Удалить HGLRC. 8. Удалить HDC.

7

Программная реализация на языке C# Ниже представлен код программы, который необходимо написать в новом проекте. В приведенном коде реализованы все пункты (с указанием их положения), кроме пунктов 5 и 6, которым будут посвящены отдельные темы. namespace WindowsFormsApplication1 //WindowsFormsApplication1 - пространство имен по умолчанию { public partial class Form1 : Form { IntPtr Handle3D; //IntPtr - тип для указателя в C# IntPtr HDC3D; IntPtr HRC3D;

public Form1() //конструктор { InitializeComponent(); //метод инициализации //компонентов, который был добавлен //автоматически при создании проекта 1)

Handle3D = Handle; //Выбираем для рисования саму форму //Если хотим, например, рисовать на панели Panel1, //то здесь необходимо указать Panel1.Handle

2)

HDC3D = User.GetDC(Handle3D);

3)

Gdi.PIXELFORMATDESCRIPTOR PFD = new Gdi.PIXELFORMATDESCRIPTOR(); //PFD - структура, содержащая описание формата //пикселей, имеет 26 полей, мы заполним только //некоторые из них 8

PFD.nVersion = 1; PFD.nSize = (short)Marshal.SizeOf(PFD); PFD.dwFlags =

//набор флагов

Gdi.PFD_DRAW_TO_WINDOW //рисуем в окне | Gdi.PFD_SUPPORT_OPENGL //включаем поддержку //OpenGL | Gdi.PFD_DOUBLEBUFFER; //и поддержку двойной //буферизации PFD.iPixelType = Gdi.PFD_TYPE_RGBA; //цвет в формате RGBA //R - красный, G - зеленый, B - синий //А - альфа-канал, отвечает за степень //прозрачности PFD.cColorBits = 24;

//24-х битный буфер цвета

PFD.cDepthBits = 32;

//32-х битный буфер глубины

PFD.iLayerType = Gdi.PFD_MAIN_PLANE; int nPixelFormat = Gdi.ChoosePixelFormat(HDC3D, ref PFD); Gdi.SetPixelFormat(HDC3D, nPixelFormat, ref PFD); 4)

HRC3D = Wgl.wglCreateContext(HDC3D); Wgl.wglMakeCurrent(HDC3D, HRC3D); //делаем контекст //воспроизведения текущим } Затем необходимо создать обработчики событий Resize (изменения

размера окна), Paint (перерисовки окна) и FormClosed (закрытия прило­ жения). Для этого в свойствах формы необходимо перейти на закладку “События (Events)” (нажав на кнопку

) и дважды щелкнуть мышкой

на соответствующих строках в таблице свойств. 9

В обработчике события Resize выполняется первая часть пункта 5: • определение типа проекции; • определение окна вывода. Соответствующие операторы OpenGL, реализующие эти операции, при­ ведены в разделе 4. В конце конструктора формы необходимо вызвать обработчик события Resize, вставив оператор Form1_Resize(null, null); для того, чтобы подготовка к рисованию выполнилась при запуске при­ ложения. В обработчике события Paint выполняется вторая часть пункта 5 и пункт 6. private void Form1_Paint(object sender, PaintEventArgs e) { //параметры очистки буферов глубины и цвета Gl.glClearColor(R,G,B,1); // 0