139 99 753KB
Russian Pages [44] Year 2022
Р.Ф. Марданов
ПРОГРАММИРОВАНИЕ КОМПЬЮТЕРНОЙ ГРАФИКИ С ИСПОЛЬЗОВАНИЕМ БИБЛИОТЕКИ 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