GLMakie
|
Страница в процессе перевода. |
GLMakie — это базовый бэкенд для компьютеров с наибольшей функциональностью. Для него требуется видеокарта с поддержкой OpenGL версии 3.3 или выше.
Активация и настройка экрана
Чтобы активировать бэкенд, вызовите GLMakie.activate!().
#
GLMakie.activate! — Function
GLMakie.activate!(; screen_config...)
Устанавливает GLMakie в качестве текущего активного бэкенда, а также (необязательно) изменяет конфигурацию экрана с помощью именованных аргументов screen_config. Обратите внимание, что screen_config также можно задать на постоянной основе с помощью Makie.set_theme!(GLMakie=(screen_config...,)).
Аргументы, которые можно передавать через screen_config:
Цикл отрисовки
-
renderloop = GLMakie.renderloop: задает функциюrenderloop(::GLMakie.Screen), которая запускает цикл отрисовки для экрана.
|
Warning Приведенные ниже именованные аргументы не действуют, если аргумент |
-
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 для отображения в вашем собственном графическом пользовательском интерфейсе. Вот краткий обзор необходимых действий.
-
Создайте тип
MyWindow, который может представлять виджет в выбранном фреймворке графического пользовательского интерфейса. Передайте экземпляр этого типа вGLMakie.Screen(; window=my_window, start_renderloop=false), чтобы получить объектScreen{MyWindow}без запуска цикла отрисовки в фоновом режиме (необязательно, зависит от приложения). Это основной объект, с которым вам предстоит работать. -
Определите специализации методов для типа
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.
-
Теперь
Figureможно отобразить на новом экране, вызвавdisplay(screen, f). Если вы не используете собственный цикл отрисовки GLMakie, вам придется позаботиться о вызовеGLMakie.render_frame(screen)там, где это необходимо (можно воспользоватьсяGLMakie.requires_update(screen)). -
display(screen, f)отрисовывает рисунок только в буфер кадров. Вы можете получить прикрепленную цветовую текстуру буфера кадров с помощьюscreen.framebuffer.buffers[:color]и отобразить ее как изображение в выбранном фреймворке графического пользовательского интерфейса. -
Если требуется интерактивность, необходимо передавать события ввода с клавиатуры и мыши в события в
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 или обновления объектов |
Настройка WSL или X-переадресация
Источник: Microsoft/WSL/issues/2855
WSL нормально работает с OpenGL, но этот сценарий не поддерживается. В чистой установке Ubuntu из магазина сделайте следующее.
sudo apt install ubuntu-desktop mesa-utils export DISPLAY=localhost:0 glxgears
На стороне Windows
-
Установите VcXsrv.
-
Выберите 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.