Также сделал сайт для движка:
https://gecko0307.github.io/dagon
OpenGL на macOS. Продолжение
Лет пять назад я прочитал на MSDN утверждение Microsoft о том, что OpenGL — «устаревшая технология». Тогда я только посмеялся. Всем прекрасно известно, что задачу по поддержке OpenGL берут на себя производители видеокарт, а не операционных систем. Никому на самом деле не важно, насколько хороша нативная поддержка OpenGL в Windows — все равно все устанавливают драйвер от производителя видеокарты. Сейчас же ситуация несколько иная — под macOS вообще никогда не было другого OpenGL, кроме нативного. Это вынуждает разработчиков принимать политическое решение, и я свое принял.
В настоящее время полноценного аналога OpenGL для кроссплатформенной разработки не существует. Direct3D есть только под Windows, Metal — только под macOS, а Vulkan не является прямым аналогом OpenGL. Прекращение поддержки OpenGL в macOS влечет необходимость поддерживать в приложении несколько графических API. Это сложная задача, полноценно решать которую способны только коммерческие компании путем найма отдельных программистов на каждый бэкенд. Любителям, инди-разработчикам и мейнтейнерам СПО необходимость поддерживать несколько API сильно усложняет жизнь (очень сильно!), не давая взамен абсолютно никаких преимуществ. Самым очевидным выходом остается просто забить на macOS.
Да, возможно, немного обидно потерять часть своих пользователей — и только лишь! Если вы раздаете свою работу бесплатно, вас это не должно особо волновать. Я могу назвать десятки операционных систем, на которых ваш код не только не заработает, но даже не скомпилируется, на каком бы графическом стеке он ни был основан. Для реального мира поддержка этих ОС не имеет никакого значения. Если ОС не предоставляет стандартный API (а тем более такой важный в наше время, как графический), значит, она не стоит того, чтобы ее поддерживать. Технологии усложнились, на дворе уже не 90-е, чтобы каждый студент мог на коленке реализовать по бэкенду для кучи несовместимых платформ. Повторяю: забить, как в свое время забили на DOS, OS/2, IRIX, NeXT и еще много чего.
По этому поводу очень хорошо выразился Саймон Рот, автор игры Maia: «I won’t port thousands of lines of my engine to a non standard proprietary API. Neither will many other developers either on principle or due to OSX’s tiny install base. Here lies the end of games on Apple’s desktop platform. Hundreds of thousands of older games will no longer run and there will be no economic incentive for the developers to rewrite their code. Even those using off-the-shelf engines would need to spend time and money to port to a newer release and retest. It’s sad. Games are made of code that goes stale by design. That’s bad, but by using open high level APIs and standards we can keep them alive and supported for much, much longer».
Дословный перевод: «Я не буду портировать тысячи строк кода моего движка на нестандартный проприетарный API. И этого не будут делать другие разработчики — из принципа или из-за небольшой пользовательской базы. Это конец игр на десктопной платформе Apple. Сотни тысяч старых игр больше не будут работать, и для их разработчиков не будет экономического стимула переписывать их код. Даже те, кто использует готовые движки, должны будут потратить время и деньги на портирование на новую версию и повторное тестирование. Это грустно. Код игр всегда устаревал со временем, и это плохо, но, благодаря использованию открытых высокоуровневых API и стандартов, мы можем сохранять их в живых и поддерживать еще очень долго».
OpenGL на macOS
GitHub и Microsoft
Patreon
Тени от частиц
Реализовано путем отброса пикселей с прозрачностью ниже порогового значения при рендеринге частиц в теневую карту. Конечно, такая техника не позволяет рендерить прозрачные тени от дыма, но и такой результат все же лучше, чем полное отсутствие теней или, тем более, тени в виде квадратиков.
Карты окружения в отложенном рендере
В ближайшее время планирую реализовать поддержку кубических карт с полноценным интегрированием Монте-Карло (сейчас используются равнопромежуточные карты с простым box-фильтром, формируемые стандартным mip-генератором OpenGL, что, конечно, дает достаточно далекий от физически корректного результат, хотя и визуально приемлемый). Также обдумываю вариант загрузки кубической карты из файла DDS, что позволяет строить мип-уровни в сторонних утилитах типа CubeMapGen.
Dagon 0.8.0. Deferred Shading на подходе
Вскрылись проблемы с работой движка под macOS — поскольку у меня нет возможности тестировать его под этой ОС, поддержка Mac отныне не гарантирована. Но буду благодарен, если кто-то исследует эту проблему и предложит решение.
Одновременно я начал работу над поддержкой отложенного освещения и уже добился результата. Заодно реализовал SSAO, мягкие частицы и улучшил функцию неба, что заметно на высоких значениях шероховатости.
Скорее всего, отложенный рендер полностью заменит кластерный. Для прозрачных объектов я планирую ввести классический прямой метод освещения с отбором ближайших к объекту источников света.
Интерполяция на основе сигмоиды
Для одного из шейдеров на GLSL мне потребовалась «умная» интерполяция цветов с возможностью изменять резкость перехода от одного значения к другому — от полностью плавного (линейного) до дискретного. В итоге получилась вот такая функция, которую я вывел на основе рациональной сигмоиды — может быть, кому-то пригодится:
float sigmoid(float x, float k)
{
return (x + x * k - k * 0.5 - 0.5) /
(abs(x * k * 4.0 - k * 2.0) - k + 1.0) + 0.5;
}
При k = 0 функция обращается в линейную, при k = 1 — разрывается в точке 0,5. Вы можете увидеть, как это работает, при помощи интерактивного графика на Desmos: https://www.desmos.com/calculator/s0cwcrtzvs.
Результат этой функции передается в привычный mix – то есть, вместо mix(c1, c2, t) пишем mix(c1, c2, sigmoid(t, k)). Получится, например, такое:















