Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
blackbox:3d [2020/01/02 17:32] иван_денисов |
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/ | + | Разберем подробнее третий пример, |
+ | |||
+ | Модуль **Sdl2/ | ||
+ | |||
+ | | ||
+ | |||
+ | < | ||
+ | PROCEDURE Viewport; | ||
+ | BEGIN | ||
+ | Gl.Viewport(0, | ||
+ | Gl.MatrixMode(Gl.GL_PROJECTION); | ||
+ | Gl.LoadIdentity; | ||
+ | IF height = 0 THEN height := 1 END; | ||
+ | Gl.Ortho(- zoom * width / height, zoom * width / height, - zoom, zoom, -1, 300); | ||
+ | END Viewport; | ||
+ | </ | ||
+ | |||
+ | | ||
+ | |||
+ | < | ||
+ | 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, | ||
+ | Gl.Color3f ( 0, 1, 0); | ||
+ | Gl.Vertex3f(-1, | ||
+ | Gl.Color3f ( 0, 0, 1); | ||
+ | Gl.Vertex3f( 1,-1, 0); | ||
+ | Gl.Color3f ( 0, 1, 1); | ||
+ | Gl.Vertex3f( 1, 1, 0); | ||
+ | Gl.End; | ||
+ | |||
+ | 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 $* & | ||
+ | </ | ||
+ | ---- | ||
+ | Автор заметки: |