Документация Engee

GLMakie

Страница в процессе перевода.

GLMakie — это базовый бэкенд для компьютеров с наибольшей функциональностью. Для него требуется видеокарта с поддержкой OpenGL версии 3.3 или выше.

Активация и настройка экрана

Чтобы активировать бэкенд, вызовите GLMakie.activate!().

GLMakie.activate!(; screen_config...)

Устанавливает GLMakie в качестве текущего активного бэкенда, а также (необязательно) изменяет конфигурацию экрана с помощью именованных аргументов screen_config. Обратите внимание, что screen_config также можно задать на постоянной основе с помощью Makie.set_theme!(GLMakie=(screen_config...,)).

Аргументы, которые можно передавать через screen_config:

Цикл отрисовки

  • renderloop = GLMakie.renderloop: задает функцию renderloop(::GLMakie.Screen), которая запускает цикл отрисовки для экрана.

Warning Приведенные ниже именованные аргументы не действуют, если аргумент renderloop не установлен в значение GLMakie.renderloop и если они не реализованы в пользовательской функции цикла отрисовки:

  • pause_renderloop = false: при значении true создается экран с приостановленным циклом отрисовки. Цикл отрисовки можно запустить с помощью вызова GLMakie.start_renderloop!(screen) и снова приостановить с помощью вызова GLMakie.pause_renderloop!(screen).

  • vsync = false: следует ли включать синхронизацию кадров для окна.

  • render_on_demand = true: при значении true сцена будет отрисовываться только в случае каких-либо изменений на ней.

  • framerate = 30.0: задает текущую частоту отрисовки кадров в секунду.

  • px_per_unit = automatic: задает соотношение между количеством отрисовываемых пикселей и разрешением Makie. По умолчанию используется значение scalefactor, но это может быть любое положительное вещественное число.

Атрибуты окна GLFW

  • float = false: должно ли окно «плавать» над другими окнами.

  • focus_on_show = false: если задано значение true, при открытии окна на него устанавливается фокус.

  • decorated = true: следует ли отображать дополнительные элементы окна.

  • title::String = "Makie": задает заголовок окна.

  • fullscreen = false: следует ли запускать окно в полноэкранном режиме.

  • debugging = false: при значении true запускается контекст GLFW.Window/OpenGL с выходными данными отладки.

  • monitor::Union{Nothing, GLFW.Monitor} = nothing: задает монитор, на котором следует открыть окно. Если задано значение nothing, GLFW выбирает используемый монитор.

  • visible = true: должно ли окно быть видимым сразу после создания.

  • scalefactor = automatic: задает коэффициент масштабирования окна, например 2.0 на дисплеях HiDPI/Retina. Устанавливается автоматически в зависимости от дисплея, но может быть любым положительным вещественным числом.

Константы отрисовки и постпроцессор

  • oit = false: следует ли включать независимую от порядка прозрачность для окна.

  • fxaa = true: следует ли включать fxaa (сглаживание) для окна.

  • ssao = true: следует ли включать преграждение окружающего света в экранном пространстве, которое имитирует естественное затенение на внутренних краях и в щелях.

  • transparency_weight_scale = 1000f0: настраивает коэффициент в шейдерах отрисовки для прозрачности, независимой от порядка. Он должен быть одинаковым для всех шейдеров (в пределах одного конвейера отрисовки), в противном случае «порядок» глубины будет нарушен.

  • max_lights = 64: максимальное количество источников света при shading = MultiLightShading

  • max_light_parameters = 5 * N_lights: максимальное количество параметров освещения, которые можно добавить. К ним относится всё, кроме цвета освещения (т. е. положение, направление, затухание, углы); задаются как скалярные значения с плавающей запятой.

Масштабирование окна

Размеры рисунков указываются в независимых от дисплея логических единицах, а бэкенд GLMakie автоматически масштабирует размер отображаемого окна на дисплеях HiDPI/Retina. Например, при значении по умолчанию size = (800, 600) на дисплее HiDPI, для которого настроен коэффициент масштабирования 200 %, будет отображаться окно размером 1600 х 1200.

Коэффициент масштабирования можно переопределить, отобразив рисунок с другим значением scalefactor.

fig = Figure(size = (800, 600))
# ...
display(fig, scalefactor = 1.5)

Если автоматически настроенный коэффициент масштабирования по умолчанию не изменяется, размер окна будет изменяться для сохранения видимого размера при перемещении между дисплеями с разными коэффициентами масштабирования в Windows и OSX. (Независимые коэффициенты масштабирования не поддерживаются X11, и на данный момент базовая библиотека GLFW не скомпилирована с поддержкой Wayland.)

Масштабирование разрешения

В зависимости от коэффициента масштабирования окна сопоставление размеров и положений рисунков с пикселями можно масштабировать для обеспечения отрисовки с разрешением HiDPI/Retina. По умолчанию для масштабирования разрешения используется тот же коэффициент, что и для масштабирования окна, но его можно независимо переопределить с помощью аргумента px_per_unit при отображении рисунка.

fig = Figure(size = (800, 600))
# ...
display(fig, px_per_unit = 2)

Коэффициент масштабирования разрешения также можно изменить при сохранении PNG-файлов.

save("hires.png", fig, px_per_unit = 2)    # PNG 1600 х 1200 пикселей
save("lores.png", fig, px_per_unit = 0.5)  #  PNG 400 х 300 пикселей

Если скрипт может выполняться в интерактивных средах, где собственное разрешение экрана в DPI может меняться, вы можете явно задать px_per_unit = 1 при сохранении рисунков, чтобы обеспечить согласованность результатов.

Несколько окон

В GLMakie реализована экспериментальная поддержка отображения нескольких независимых рисунков (или сцен). Чтобы открыть новое окно, используйте display(GLMakie.Screen(), figure_or_scene). Чтобы закрыть все окна, используйте GLMakie.closeall().

Внедрение

В качестве экспериментальной функции реализована поддержка внедрения GLMakie путем создания пользовательского типа окна (аналогичного окну уровня GLFW ОС) и захвата буферов кадров GLMakie для отображения в вашем собственном графическом пользовательском интерфейсе. Вот краткий обзор необходимых действий.

  1. Создайте тип MyWindow, который может представлять виджет в выбранном фреймворке графического пользовательского интерфейса. Передайте экземпляр этого типа в GLMakie.Screen(; window=my_window, start_renderloop=false), чтобы получить объект Screen{MyWindow} без запуска цикла отрисовки в фоновом режиме (необязательно, зависит от приложения). Это основной объект, с которым вам предстоит работать.

  2. Определите специализации методов для типа MyWindow. Вот неполный список.

    • Base.isopen(::MyWindow)

      • ShaderAbstractions.native_switch_context!(::MyWindow) (переключение на контекст OpenGL окна)

      • ShaderAbstractions.native_context_alive(::MyWindow) (проверка действительности контекста OpenGL для окна)

      • GLMakie.framebuffer_size(::MyWindow) (получение размера буфера кадров для окна)

      • GLMakie.destroy!(::MyWindow) (уничтожение окна, должно быть холостой операцией, если только не нужно действительно закрыть окно GLMakie)

      • GLMakie.connect_screen(::Scene, Screen{MyWindow}) (подключение сигналов ввода, например от клавиатуры и мыши; вместо этого может потребоваться реализовать отдельные методы подключения)

Фактическая реализация всех этих методов полностью зависит от способа внедрения GLMakie.

  1. Теперь Figure можно отобразить на новом экране, вызвав display(screen, f). Если вы не используете собственный цикл отрисовки GLMakie, вам придется позаботиться о вызове GLMakie.render_frame(screen) там, где это необходимо (можно воспользоваться GLMakie.requires_update(screen)).

  2. display(screen, f) отрисовывает рисунок только в буфер кадров. Вы можете получить прикрепленную цветовую текстуру буфера кадров с помощью screen.framebuffer.buffers[:color] и отобразить ее как изображение в выбранном фреймворке графического пользовательского интерфейса.

  3. Если требуется интерактивность, необходимо передавать события ввода с клавиатуры и мыши в события в Makie.get_scene(f).events ([The Events

struct](@ref)).

Принудительное использование выделенного GPU в Linux

Обычно для отрисовки применяется выделенный GPU. Если вместо этого используется интегрированный GPU, можно сообщить среде Julia о том, что необходимо использовать выделенный GPU, запустив ее с помощью команды $ sudo DRI_PRIME=1 julia в терминале bash. Чтобы использовать этот GPU постоянно, добавьте строку export DRI_PRIME=1 в файл .bashrc или .zshrc.

Устранение неполадок OpenGL

Если при загрузке GLMakie возникает ошибка, скорее всего, это означает, что у вас нет видеокарты с поддержкой OpenGL или не установлен драйвер с поддержкой OpenGL 3.3. Обратите внимание, что большинство GPU, даже интегрированные 8-летней давности, поддерживают OpenGL 3.3.

В Linux узнать версию OpenGL можно так: glxinfo | grep "OpenGL version"

При использовании GPU от AMD или Intel в Linux может возникнуть проблема GLFW#198.

Если у вас удаленно управляемый сервер, все равно необходимо установить X-сервер и соответствующие графические драйверы.

Демонстрацию настройки можно найти в статье nextjournal.

В CI GLMakie нет GPU, поэтому рабочую конфигурацию можно также посмотреть в файле .github/workflows/glmakie.yaml.

Если ни один из этих вариантов вам не подходит, обратите внимание на другие бэкенды, которые работают без GPU.

Если происходит ошибка, указывающая на GLFW.jl, изучите существующие проблемы GLFW и поищите информацию об этой ошибке в Google. Скорее всего, необходимо исправить что-то в библиотеке GLFW на C или в драйверах GPU.

Warning Бэкенд GLMakie не является потокобезопасным. Функции Makie для отображения в GLMakie или обновления объектов Observable, отображаемые в окнах GLMakie из других потоков, могут работать непредвиденным образом или вызывать ошибку сегментации.

Настройка WSL или X-переадресация

Источник: Microsoft/WSL/issues/2855

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

sudo apt install ubuntu-desktop mesa-utils
export DISPLAY=localhost:0
glxgears

На стороне Windows

  1. Установите VcXsrv.

  2. Выберите multiple windows -> display 0 -> start no client -> disable native opengl.

Устранение неполадок

(1) Установите sudo apt-get install -y xorg-dev mesa-utils xvfb libgl1 freeglut3-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev.

(2) В WSL есть небольшие проблемы с прохождением через localhost, поэтому может потребоваться использовать export DISPLAY=192.168.178.31:0 с локальным IP-адресом сетевого адаптера ПК, на котором работает VcXsrv.

(3) Может потребоваться mv /opt/julia-1.5.2/lib/julia/libstdc++.so.6 /opt/julia-1.5.2/lib/julia/libcpp.backup (еще одна форма ошибки GLFW#198).

GLMakie не отображает рисунок или завершает работу со сбоем в полноэкранном режиме в macOS

MacOS выдает предупреждение, если графический пользовательский интерфейс (GUI) не запущен из AppBundle, и это исключение может привести к сбою процесса Julia, инициировавшему GUI. Это предупреждение появляется только в том случае, если настройка macOS Settings -> Desktop & Dock -> Menu Bar -> Automatically hide and show the menu bar не установлена в значение Never. Поэтому, чтобы GLMakie можно было использовать в macOS, убедитесь в том, что эта настройка установлена в значение Never.