Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
blackbox:3d [2020/01/02 17:41] иван_денисов |
blackbox:3d [2021/06/19 15:10] (текущий) iadenisov [Обзор примеров] |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Разработка приложений с применением OpenGL ====== | ====== Разработка приложений с применением OpenGL ====== | ||
| - | Чтобы разрабатывать в [[: | + | Чтобы разрабатывать в [[: |
| + | |||
| + | {{ : | ||
| + | |||
| + | Однако для разработки прикладных кросс-платформенных приложений более практично создавать окна | ||
| ===== Настройка среды разработки ===== | ===== Настройка среды разработки ===== | ||
| - | Чтобы установить расширение Sdl2 в Блэкбокс, скачайте закодированный файл с сайта: | + | Файл архива |
| - | https:// | + | |
| - | Откройте скачанный текстовый документ в Блэкбоксе и выберите команду **Инструменты/ | + | {{ : |
| - | Перед тем как откомпилировать модули подсистемы Sdl2, необходимо установить также непосредственно само расширение для работы с OpenGL: https:// | + | Если пока не ориентируетесь в среде разработки Блэкбокс, то мы рекомендуем перед |
| - | После того как модули Ogl распакованы, запустите команды для компиляции модулей в зависимости от вашей платформы. Команды запускаются с помощью коммандеров (кружков с восклицательными знаками). Если пока не ориентируетесь в среде разработки | + | Если выбираете готовую сборку |
| - | Скачайте и распакуйте в рабочую папку необходимые библиотеки Sdl2. Ссылки для загрузки вы найдете в документе **Sdl2/ | + | Для того, чтобы самостоятельно настроить среду необходимо выполнить следующие действия действия: |
| + | |||
| + | - Скачайте [[blackbox: | ||
| + | - Установите расширение Sdl2, для чего [[https:// | ||
| + | - Откройте скачанный текстовый документ в Блэкбоксе и выберите команду **Инструменты/ | ||
| + | - Перед тем как откомпилировать модули подсистемы Sdl2, необходимо установить также непосредственно само расширение для работы с OpenGL: https:// | ||
| + | - После того как модули Ogl распакованы, | ||
| + | - Скачайте и распакуйте в рабочую папку необходимые библиотеки Sdl2. Ссылки для загрузки вы найдете в документе **Sdl2/ | ||
| - | После того, как библиотеки установлены, | ||
| - | ```(!) DevCompiler.CompileThis Sdl2ObxOpenGL``` | + | После того, как все действия выполнены, |
| + | |||
| + | ===== Обзор примеров ===== | ||
| + | |||
| + | |||
| + | **Sdl2ObxLoop** дает представление о работе с петлей обработки событий Sdl2 и кросс-платформенными командами рисования на окне простейших примитивов. | ||
| + | |||
| + | Важно, что при запуске нового примера необходимо выгрузить модуль предыдущего примера. Это связано с тем, что петля обработки событий Sdl2 общая для всех окон. Поэтому единовременный запуск нескольких примеров из одного Блэкбокса, | ||
| + | |||
| + | **Sdl2ObxTwo** рассматривает как организовать работу с несколькими окнами. В этом примере в окнах не происходит отрисовки, | ||
| + | |||
| + | **Sdl2ObxOpenGL** показывает как создать контекст для рисования команадми OpenGL. | ||
| + | |||
| + | '' | ||
| и запустить его командой: | и запустить его командой: | ||
| - | ```(!) Sdl2ObxOpenGL.Start``` | + | '' |
| Появится окно с квадратом, | Появится окно с квадратом, | ||
| {{ : | {{ : | ||
| + | |||
| + | |||
| + | **Sdl2ObxTexture** показывает как наложить текстуру. | ||
| + | |||
| + | **Sdl2ObxModels** демонстирирует возможность загрузки трехмерных объектов в формате **ms3d** с текстурами. Трехмерные объекты в формате **ms3d** для ваших приложений удобно создавать в бесплатном приложении Blender. Поддержка формата **ms3d** отключена по-умолчанию, | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | **Sdl2ObxSnapshotGL** — пример захвата изображения из OpenGL сцены, и сохранения в формате PNG. | ||
| + | |||
| + | **Sdl2ObxTtf** раскрывает особенности работы со шрифтами. | ||
| + | |||
| + | **Sdl2ObxIcosphere** — пример рисования корректно освященной сферы с помощью икосаэдра. | ||
| + | |||
| + | {{ : | ||
| + | |||
| ===== Разбор примера Sdl2ObxOpenGL ===== | ===== Разбор примера Sdl2ObxOpenGL ===== | ||
| - | Модуль **Sdl2/ | + | Разберем подробнее третий пример, который применяет команды OpenGL. |
| - | **Viewport** --- вызывает команды OpenGL для формирования проекции трехмерных объектов на экран. | + | Модуль **Sdl2/ |
| + | |||
| + | | ||
| < | < | ||
| Строка 45: | Строка 85: | ||
| </ | </ | ||
| - | **Render** --- вызывает команды для создания самих трехмерных объектов, | + | |
| - | **Handle** | + | < |
| + | PROCEDURE Render; | ||
| + | BEGIN | ||
| + | Gl.MatrixMode (Gl.GL_MODELVIEW); | ||
| + | Gl.ClearColor(0, | ||
| + | Gl.Clear(Gl.GL_COLOR_BUFFER_BIT + Gl.GL_DEPTH_BUFFER_BIT); | ||
| + | |||
| + | Gl.LoadIdentity; | ||
| + | Gl.Translatef( 0, 0, -6); | ||
| + | Gl.Begin(Gl.GL_QUADS); | ||
| + | Gl.Color3f ( 1, 0, 0); | ||
| + | Gl.Vertex3f(-1, 1, 0); | ||
| + | Gl.Color3f ( 0, 1, 0); | ||
| + | Gl.Vertex3f(-1,-1, 0); | ||
| + | Gl.Color3f ( 0, 0, 1); | ||
| + | Gl.Vertex3f( 1,-1, 0); | ||
| + | Gl.Color3f ( 0, 1, 1); | ||
| + | Gl.Vertex3f( 1, 1, 0); | ||
| + | Gl.End; | ||
| - | **Do** --- является реализацией отложенных действий в каркасе Блэкбокс, | + | Sdl2Video.GL_SwapWindow(w) |
| + | END Render; | ||
| + | </ | ||
| + | | ||
| + | < | ||
| + | PROCEDURE CloseWindow; | ||
| + | BEGIN | ||
| + | IF c # NIL THEN Sdl2Video.GL_DeleteContext(c); | ||
| + | IF w # NIL THEN Sdl2Video.DestroyWindow(w); | ||
| + | END CloseWindow; | ||
| + | </ | ||
| + | | ||
| + | < | ||
| + | PROCEDURE (this: Loop) Handle (VAR e: Sdl2Lib.Event; | ||
| + | BEGIN | ||
| + | WITH e: Sdl2Events.Quit DO | ||
| + | stop := TRUE | ||
| + | | e: Sdl2Events.WindowEventClose DO | ||
| + | CloseWindow | ||
| + | | e: Sdl2Events.WindowEventResized DO | ||
| + | IF e.w + e.h # 0 THEN | ||
| + | width := e.w; | ||
| + | height := e.h; | ||
| + | update := TRUE | ||
| + | END; | ||
| + | | e: Sdl2Events.WindowEventSizeChanged DO | ||
| + | update := TRUE | ||
| + | | e: Sdl2Events.WindowEventShown DO | ||
| + | update := TRUE | ||
| + | | e: Sdl2Events.WindowEventFocusGained DO | ||
| + | update := TRUE | ||
| + | | e: Sdl2Events.MouseWheelEvent DO | ||
| + | zoom := zoom + 0.1 * e.x; | ||
| + | IF zoom < 0.1 THEN zoom := 0.1 END; | ||
| + | update := TRUE | ||
| + | ELSE | ||
| + | END | ||
| + | END Handle; | ||
| + | </ | ||
| + | |||
| + | | ||
| + | |||
| + | < | ||
| + | PROCEDURE (a: Action) Do; | ||
| + | BEGIN | ||
| + | IF c # NIL THEN | ||
| + | IF update THEN | ||
| + | Viewport; | ||
| + | Render; | ||
| + | update := FALSE | ||
| + | END; | ||
| + | Services.DoLater(a, | ||
| + | END | ||
| + | END Do; | ||
| + | </ | ||
| + | |||
| + | | ||
| + | |||
| + | < | ||
| + | PROCEDURE Start*; | ||
| + | VAR res: INTEGER; | ||
| + | BEGIN | ||
| + | (* Loading realisation of Sdl2Std abstract interface *) | ||
| + | IF Dialog.IsWindows() THEN | ||
| + | ASSERT(Kernel.ThisMod(' | ||
| + | ELSIF Dialog.IsLinux() THEN | ||
| + | ASSERT(Kernel.ThisMod(' | ||
| + | ELSE | ||
| + | HALT(20) | ||
| + | END; | ||
| + | |||
| + | width := initWidth; | ||
| + | height := initHeight; | ||
| + | |||
| + | CloseWindow; | ||
| + | Sdl2Lib.Quit; | ||
| + | res := Sdl2Lib.Init(Sdl2Const.INIT_VIDEO + Sdl2Const.INIT_EVENTS); | ||
| + | |||
| + | w := Sdl2Video.CreateWindow(" | ||
| + | Sdl2Const.WINDOW_OPENGL + Sdl2Const.WINDOW_RESIZABLE); | ||
| + | c := Sdl2Video.GL_CreateContext(w); | ||
| + | Sdl2Video.GL_MakeCurrent(w, | ||
| + | |||
| + | Gl.ClearColor(0, | ||
| + | Gl.Enable(Gl.GL_COLOR_MATERIAL); | ||
| + | Gl.ColorMaterial(Gl.GL_FRONT, | ||
| + | Viewport; | ||
| + | |||
| + | NEW(loop); | ||
| + | Sdl2Lib.StartLoop(loop); | ||
| + | |||
| + | update:= FALSE; | ||
| + | IF updater = NIL THEN NEW(updater) END; | ||
| + | Services.DoLater(updater, | ||
| + | END Start; | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Создание отдельного приложения ===== | ||
| + | |||
| + | Предыдущий пример показывает, | ||
| + | |||
| + | В документации примеров **Sdl2ObxModels** и **Sdl2ObxIcosphere** содержаться примеры команд сборки независимых приложений OS Windows и других платформ. | ||
| + | |||
| + | При этом в секции '' | ||
| + | |||
| + | < | ||
| + | quit := FALSE; | ||
| + | WHILE ~ quit DO | ||
| + | (* drive services for actions loop *) | ||
| + | Services.actionHook.Step; | ||
| + | Sdl2Lib.Delay(10) | ||
| + | END; | ||
| + | Sdl2Lib.Quit | ||
| + | </ | ||
| + | |||
| + | Этот цикл обеспечивает работу механизма отложенных действий в Блэкбоксе. | ||
| + | |||
| + | Чтобы не делать отдельные модули для демонстрации сборки автономных приложений, | ||
| + | |||
| + | '' | ||
| + | |||
| + | При этом в исходных кодах варианты оформлены с помощью так называемых << | ||
| + | |||
| + | Готовое приложение необходимо распространять вместе с набором библиотек. | ||
| + | |||
| + | В операционных системах GNU/Linux, OpenBSD или FreeBSD еще необходимо задать переменную окружения, | ||
| + | < | ||
| + | #!/bin/sh | ||
| + | LD_LIBRARY_PATH=./ | ||
| + | ./icosphere $* & | ||
| + | </ | ||
| + | ---- | ||
| + | Автор заметки: | ||