Уроки, алгоритмы, программы, примеры

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

У меня проблема вот с этим: gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);. Вылезает ошибка: CS1061 "object" не содержит определения "GL_COLOR_BUFFER_BIT", и не удалось найти доступный метод расширения "GL_COLOR_BUFFER_BIT",...
Большое спасибо. Единственный код который прошел без каких либо ошибок. Ура!!!
Скажите пожалуйста, подскажите алгоритм по которому по заданным точкам можно определить тип многогранника, скажем это куб или прямоугольный параллелепипед. Нашел теорию по этим фигурам: https://www.mat... https://www.mat... Акцентировать внимание...
Всем у кого не работает. файл wizard.script Ещё одно упоминание Glut32 в строке "if (!VerifyLibFile(dir_nomacro_lib, _T("glut32"), _T("GLUT's"))) return false;" меняем на "if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("GLUT's"))) return...
Не получается, емаё

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Среда программирования: 
Microsoft C#

В данном уроке демонстрируется подключение интерфейса OpenGL и приводится пример создания простого изображения с использованием этой технологии.

Для создания проекта нам понадобится Microsoft Visual Studio 2015. Для версий 2010 и 2012 разработаны специальные расширения, однако в данном уроке будет использована именно MVS 2015, для которой OpenGL подключим вручную. Объяснения будут как на русском, так и на английским языках. Ссылка на бесплатную редакцию:
https://www.microsoft.com/ru-ru/SoftMicrosoft/vs2015Community.aspx

1. Создание Приложения WindowsForms / Windows Forms Application

1. Нажимаем CTRL+SHIFT+N или выбираем Файл (File)->Создать (New)->Проект (Project).
2. Слева в пункте Установленные (Installed) разворачиваем пункт Шаблоны (Templates) и выбираем пункт Visual C#.
3. В списке выбираем Приложение Windows Forms (Windows Forms Application), задаем имя проекта и нажимаем OK.

2. Скачиваем библиотеки SharpGl

Готовые файлы можно найти в материалах к уроку - это архив ...SharpGL.WinForms.zip.
Также материалы можно скачать и с официального сайта, для этого надо перейти на
http://sharpgl.codeplex.com/releases или зайти через главную страницу
http://sharpgl.codeplex.com в раздел Downloads. Нам нужна версия SharpGL 2.3. Под тегом RECOMMENDED DOWNLOAD переходим по ссылке SharpGL Assemblies (WPF & Winforms), будет загружен архив с папкой Core. В ней нам понадобится не все - только файлы из папки SharpGL.WinForms. В разделе OTHER AVAILABLE DOWNLOADS. можно скачать примеры по Samples, о которых будет идти речь в следующих уроках. Тут же и расширения для MVS 2010 и MVS 2012. Версия 2.3 рабочая и для 2012 Студии. Иначе можно скачать и с GitHub по ссылке https://github.com/dwmkerr/sharpgl/releases/tag/v2.3.0.1.

3. Подключение ссылок

Для подключения существует два пути. Первый: раздел из вкладки Сервис(Tools) в Диспетчер пакетов Nuget (NuGet Package Manager)->Консоль диспетчера пакетов (Package Manager Console)–>Выбрать в качестве Источника пакетов (Package Source) "nuget.org"(можно оставить все)->Ввести Install-Package SharpGL->Ввести Install-Package SharpGL.WinForms.

Второй способ: найти в Обозревателе решений (Solution Explorer) раздел Cссылки (References)->Добавить ссылку (Add reference):

Откроется Менеджер ссылок, необходим Обзор, далее находим у себя в файловой системе папку SharpGL.WinForms, где и лежат требуемые библиотеки SharpGl.dll, SharpGl.SceneGraph.dll, SharpGl.WinForms.dll:

Помечаем их:

Далее надо проверить в Обозревателе решений, в пункте Ссылки (References), появились ли ссылки SharpGl, SharpGl.SceneGraph, SharpGl.WinForms:

3. Добавление в панель элементов новых элементов

Первый шаг – простой, но не обязательный. Чтобы не добавить элементы в вкладку Общие, сделаем следующее. Свернем все группы элементов, последняя вкладка – Общие - обычно пустая, и если ее открыть, выскакивает надпись, что в данной группе элементов нет. Давайте щелкнем в свободной области панели правой кнопкой мыши и выберем «Добавить вкладку» из выпадающего списка. Создадим новую вкладку элементов, например, «MyOpenGL» – «группу» можно назвать как угодно:

Так как вкладка новая, увидим, что там элементов нет, щелкнем правой кнопкой по полоске с названием вкладки и далее из списка в «Выбрать элементы»:

В новом окне будет много вкладок, требуемая - «Компоненты .NET Framework». Зайдем в обзор и найдем в наших файлах SharpGL.WinForms.dll. Открываем, в списке можно глянуть, добавились ли элементы, жмем OK:

Во вкладке MyOpenGL должны появиться элементы Указатель (Стандартно), GLColorPicker, OpenGLControl, SceneControl, VertexControl. Новые элементы добавлены и теперь можно наконец-то приступать к разработке.

4. Создание экземпляра OpenGL-формы

Для этого располагаем OpenGLControl на нашу форму и заходим в свойства нового объекта. Для лучшей ориентации рекомендуется использование категорий. Находим в первой же категории SharpGL такие атрибуты:
Dock – позиция нового «контрола» на форме. Введем «Fill», чтобы наш «контрол» занял всю площадь. Также можно из выпадающего списка выбрать «Центр», интуитивно будет понятно, что имеется в виду.
FrameRate – количество кадров, которые будут отрисованы в секунду. По умолчанию там 20, изменим на 30. Однако этот параметр зависит от того, насколько «тяжелое» приложение и FPS может быть и ниже.
OpenGLVersion – версия технологии, которую мы реализовываем – это OpenGL2_1, и она уже задана по умолчанию. На момент создания урока последняя версия – OpenGL4_4.
RenderTrigger – один из контекстов рендеринга, можно выбрать TimerBased – тогда каждый кадр будет отрисовываться на основании времени, т.е. с определенной частотой секунд. Если мы зададим Manual – рендеринг каждого кадра надо будет реализовывать вручную.
Последний, и самый интересный – DrawFPS.
Его используют, если хотят проверить, как работает приложение. Можете сразу перейти к выполнению следующего пункта, но лучше прочитайте его до конца.
Зададим значение атрибута DrawFPS равным True. После запуска проекта получим ошибку типа System.NullReferenceException и следующие:
«Элемент управления Sharp.OpenGL вернул в конструкторе необработанное исключение и был отклонен. Исключение: Ссылка на объект не указывает на экземпляр объекта.»

Это происходит, если предварительно не задать в событиях нашего «контрола» свойство атрибута OpenGLDraw, просто щелкнув мышью по незаполненному полю атрибута. Перейдем из конструктора к коду, для этого можно нажать F7 или на поле формы щелкнуть правой кнопкой мыши и выбрать этот пункт из выпадающего списка. Увидим, что появилась следующая функция – обработчик событий, которая и отрисовывает «контрол»:

private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args){}

Она будет вызываться каждый раз при отрисовке нашего кадра – как в цикле.
Теперь можно запустить проект и он успешно выполнится. Вывод будет состоять из просто черного экрана. На форме в конструкторе будет отображаться текст ошибки:

Это будет оставаться, пока не реализуем пункт 5, и поэтому не стоит обращать внимание. Все же лучше этого не видеть и сделать все сразу правильно.

5. Очистка буфера и создание. Реализация отрисовки

После всех операций при запуске приложения внизу все равно будут отображаться непонятные цифры и символы:

Это происходит, потому что картинка обновляется очень много раз в секунду, но мы ее не очищаем и она заполняет буфер. Устраним это.
Для того, чтобы не использовать полные имена типов, сначала просто пропишем вверху пространства имен:

using ShaprGL;

Там находятся все те функции, которые нам необходимы для работы в этом примере. В коде мы видим Инициализатор формы InitializeComponent(); – ее конструктор, который создан автоматически.
В обработчике событий пропишем следующие команды. Т.к. мы реализуем ООП, то сначала создаем экземпляр окна, в котором будем рисовать, чтобы было удобно обращаться к нашему «контролу».

OpenGL gl = this.openGLControl1.OpenGL;

После вызываем функцию очистки буфера и очищаем и цветовой буфер – буфер, в котором хранятся цвета объектов, и буфер глубины – уже с «глубинами» этих объектов с помощью операции «ИЛИ» (|). Дело в том, что без этой операции изображения и цифры просто будут накладываться друг на друга, и мы будем видеть то изображение, которое получили в пункте 4.

gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);

Далее возвращаем центр координат в начальную точку и сбрасываем модельно-видовую матрицу, которая реализовывает передвижение, вращение и подобные операции над объектами.

После выполняем сдвиг пера, которым будем рисовать объекты, с помощью метода gl.Translate(X.Xf, Y.Yf, Z.Zf). Для этого устанавливаем Z.Zf = -5.0f, а остальное – по нулям. И, наконец, рисуем белый треугольник.

Задание цвета производится методом gl.Color(R.rf, G.gf, B.bf);, принимающего на вход три вещественных параметра в диапазоне [0.0; 1.0] - интенсивность красного, зеленого и синего цветов соответственно.

Ниже приведенный код при запуске выводит нам такую фигуру:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SharpGL;
 
namespace SharpGL
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args)
        {
            // Создаем экземпляр
            OpenGL gl = this.openGLControl1.OpenGL;
 
            // Очистка экрана и буфера глубин
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
 
            // Сбрасываем модельно-видовую матрицу
            gl.LoadIdentity();
 
            // Двигаем перо вглубь экрана
            gl.Translate(0.0f, 0.0f, -5.0f);
 
            gl.Begin(OpenGL.GL_TRIANGLES);
 
            // Указываем цвет вершин
            gl.Color(1f, 1f, 1f);
 
            gl.Vertex(-1f, -1f);
            gl.Vertex(0f, 1f);
            gl.Vertex(1f, -1f);
 
            // Завершаем работу
            gl.End();
 
        }
    }
}

Прикрепленный файлРазмер
Ametov_LOne_Project.zip388.49 кб
Ametov_LOne_SharpGL.WinForms.zip417.04 кб