bgfx - обёртка над низкоуровневыми графическими api (все основные под desktop, телефоны и web).
dasBGFX - байндинги библиотеки к daScript.
bgfx
умеет использовать glfw
или sdl
для создания окна, dasBGFX
использует dasGlfw
. Также модуль содержит DSL для трансляции шейдеров с daScript-like языка на BGFX (glsl-like)
В качестве инструкции по сборке можно использовать заметки:
daScript - live-режим - сборка с glfw
daScript. SFML, dasBox и semi-transparent render target - сборка байндингов для sfml
По аналогии:
- выкачиваем сабмодули из git
- включаем дефайны в cmake
- добавляем зависимости от модулей dasGlfw и dasBGFX в какой-нибудь из тестовых проектов
- перегенерируем решение
- проверяем, что настройках проекта добавились пути к include и lib от модулей
- запускаем простые примеры
Независимая от порядка рендера полупрозрачность
Попробуем портировать чуть более сложный пример - Weighted Blended Order-Independent Transparency
с bgfx
(иначе вообще зачем он нужен?)
Очень кратко об идее:
“Традиционный” рендер полупрозрачных полигонов чувствителен и порядку рендера, для корректного смешивания необходимо выводить объекты от дальнего к ближнему по отношению к наблюдателю. Это не всегда удобно, так как:
- объекты могут быть “сплетены”, из-за чего их невозможно отсортировать
- трата времени на сортировку
непрозрачные объекты могут при определенных условиях требовать рендеринга как полупрозрачные - забор с дырками на большом отдалении может содержать прозрачный и непрозрачный полигон, и начать “просвечивать”
Способы избавиться от необходимости сортировки:
- порезать объекты на части (требует сложной подготовки)
- хранить не только цвет/альфу ближайшего к наблюдателю пикселя, а список из нескольких (требует расхода памяти)
- переопределить оператор смешивания на коммутативный
К третьей группе относится метод Weighted Blended Order-Independent Transparency
пост от автора, дополнение и пейпер. Также - [движок] с реализацией, и описание в книге Computer graphics. Principles and practice
(всё - от него же).
Пара других примеров - имплементация в движке cesium (webgl) и пример на bgfx
Собственно, спортить пример напрямую не получилось, поэтому реализация скорее не перевод примера, а из поста, “в лоб”, возможно некорректная, но вроде похожая не референсный скриншот из оригинала.
Других прямых референсов откопать не удалось, а сравнить с “традиционной” прозрачность нельзя, так как независимые от порядка методы содержат погрешности, конкретно weighted blended
, как следует из названия, содержит “веса” объектов, в зависимости от их прозрачности и удаленности от камеры, так что для корректного использования необходимо представлять себе диапазоны возможных значений. Так что тут скорее “проба API
“, а не нормальная реализация.
Инициализация
После создания окна
Создание двух view
Один - для рендера в 2 текстуры, второй - для смешивания текстур с восстановлением альфы на экране
Создание 2х RT-текстур, в сумме 5 каналов 16-битных float-каналов - RGBA + модификатор
Заливка текстур начальным значением
Проход 1 - рендер полупрозрачных объектов
(алгоритм позволяет использовать уже накопленный буфер глубины и совмещается с другими техниками рендера, но тут - наиболее простая референсная сцена с тремя полупрозрачными квадами)
Шейдер
Небольшое необходимое дополнение к DSL-шейдеров:
Настройка смешивания и отрисовка
В пейпере автора рассматривается этот подход и альтернативный, для gpu без поддержки задания раздельных режимов смешивания для различных render target. Они немного отличаются в коде шейдера и смешивании, важно не перепутать сочетание
Задание раздельных функций смешивания для render-target выглядят в BGFX страшно - в первый параметр передаётся флаг BGFX_STATE_BLEND_INDEPENDENT
, а во второй (который 32-битный и называется _rgba) - битовая маска для описания режима смешивания второй RT. В c-api это спрятано за макросом для немного менее страшной записи.
На этой стадии можно попробовать отрисовать сцену и подключиться к приложению через графический отладчик, чтобы проверить состояние RT-текстур (например, RenderDoc
):
текстура развёрнута по y
Проход 2 - восстановление альфа канала по текстуре с весами
Шейдер
Настройка смешивания и отрисовка
Результат