LINUX.ORG.RU
ФорумTalks

Пишу «принципиально новый» (:D) 3D графический движок

 , , , ,


1

3

Что из себя будет представлять: библиотека на C++ для работы с real-time 3D графикой. Часть будущего игрового движка, который пока только в мечтах (вероятнее всего будет состоять из 3D графического движка, движка позиционного звука, движка физики, движка скриптов и фасада над этим всем).

Основная архитектурная задумка: есть parent-child дерево объектов, состояние которых не зависит от используемого api рендеринга (OpenGL 3.3 Core, OpenGL 4.5+ Core, Vulkan, DirectX, ...) или операционной системы. Узел 'A' является дочерним по отношению к узлу 'B', если без узла 'B' узел 'A' не имеет смысла (например инстанс меша без сцены). Некоторые типы узлов могут менять своё состояние в зависимости от родительских или дочерних узлов, которые при могут не быть непосредственными parent/child конкретного узла. По этому дереву «модели» строятся деревья «контроллеров» — в основном рендеры, но можно и что-нибудь ещё туда прикрутить (мутаторы от пользовательского ввода, например).

Уже есть: «основа» движка — меши; шейдеры; (квази)статичные 2д текстуры (aka картинки, меняться могут, но редко); 2д текстуры, в которые выполняется внеэкранный рендеринг; OpenGL 4.5+ Core (требует ARB_bindless_texture) рендер; плагин со статичной геометрией; плагин для загрузки сцен с помощью библиотеки libassimp.

Запланировано: поддержка арматуры/скелетной анимации; модели освещения; Vulkan рендер.

Ядро движка: https://gitlab.com/KawaiiGraphics/Kawaii3D

OpenGL рендер: https://gitlab.com/KawaiiGraphics/Misaka3D

Assimp плагин: https://gitlab.com/KawaiiGraphics/KawaiiAssimp

Плагин со статичной геометрией: https://gitlab.com/KawaiiGraphics/KawaiiFigures3D

Сэмплы: https://gitlab.com/KawaiiGraphics/Kawaii3D-Samples

Скриптики для простой компиляции и запуска самлов, без необходимости ставить что-либо из моего софта в систему: https://gitlab.com/KawaiiGraphics/KawaiiEnvironment

Зависимости: Qt5, glm, libassimp (только для плагина KawaiiAssimp, https://github.com/assimp/assimp), sib_utils (https://gitlab.com/VadikLeshy/sib_utils).

Гну/Линукс при том, что это, вероятно, единственная ОС, где сие поделие работает как надо. В дальнейшем я добавлю полноценную поддержку, и форточек, и бздей, но сейчас хотя бы под линухом завезти всё, что запланировано.

upd: Сделал рефакторинг — теперь связи с родительскими (возможно не нпрямую) узлами, влияющими на поведение вычисляются в самом движке, а не в рендерах. Запустил одну из демок на Raven Ridge (вторая всё так же вызывает на нём GPU hang из-за фреймбуффера).

Скриншоты: AMD Raven Ridge: 1, 2.

AMD Radeon R7 M440: 1, 2, 3.

upd2: Решены некоторые проблемы со сборкой при использовании скриптов из репозитория KawaiiEnvironment.

★★★★★

Последнее исправление: robus (всего исправлений: 5)

Ответ на: комментарий от peregrine

базовые вещи это освещение и z-буфер. Хоть второй есть?

z-buffer появился там раньше, чем возможность рендерить треугольники раньше. Освещение это очень важно и тяп-ляп делать не хочется. Продумываю систему, где вычисление освещенности текселя отделено от перебора светильников, shadow теста и тому подобного.

robus ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Вот это вопрос!!! Как подписаться на событие/сигнал у чистых Qt (культей)?

Я сделал так:

//...
bool KawaiiSurface::eventFilter(QObject *obj, QEvent *event)
{
  if(obj != wnd)
    return false;

  switch (event->type()) {
    case QEvent::UpdateRequest:
    case QEvent::Expose:
      if(wnd->isExposed())
        wnd->requestUpdate();
      break;

    case QEvent::Resize:
      onSfcResized(static_cast<QResizeEvent*>(event)->size());
      break;

    default: break;
    }
  return false;
}
//...

Далее в рендере тоже есть eventFilter:

//...
bool MisakaSurfaceCtrl::eventFilter(QObject *obj, QEvent *event)
{
  if(model && obj == model->getWindow() && event->type() == QEvent::UpdateRequest)
    render();

  return false;
}
//...
И KawaiiSurface и MisakaSurfaceCtrl устанавливаются в качестве eventFiltr-ов для окошка (объект класса QWindow или производного), в которое рендерим сцену.

Нет, нашел, но только в контексте OGL. Так что, другого варианта синкаться с рефреш рейт нет?

Не распарсил.

robus ★★★★★
() автор топика
Последнее исправление: robus (всего исправлений: 2)
Ответ на: комментарий от Deleted

У меня есть ещё старый движок sib_engine3d. Он умеет освещение с теневыми картами, примитивные вычислительные шейдеры, скелетную анимацию на CPU, но он сдох. Его архитектура не позволяет ни нормально разрабатывать его, ни писать на нём. Жесткая привязка к OpenGL 3.3 Core не позволяет оптимизировать рендеринг. Разрабатывался он без какой-либо системы контроля версий и есть только на моем локалхосте.

Если кому-нибудь интересно, могу заморочится и выложить его на GitLab тоже. Вот только исходники почитать не удастся — стиль кода ужасен, архитектура дно настолько, что мне пришлось переосмыслять вообще всё и писать почти с нуля.

robus ★★★★★
() автор топика

интересно, будет ли движёк работать на альтернативно одарённых платформах, типа Android? То есть намёк на будет ли поддерживаться рендер на OpenGLES3, OpenGLES2 ну и для стареньких компов OpenGL2? Хотелось бы что-бы движёк был чуть более универсальный. Будет ли выбор движка физики? поддержка сети? Как будет сделана работа с событиями? Можно ли группировать объекты(Prefab)? Генераторы разные, деревьв? оптимизации, при которых будут лоды, ноды, перекрывающие рендер каких-то объектов поверхности?

OpenMind ★★★★
()
Ответ на: комментарий от robus

Radeon R7 440M; (основная машина)

Грустно посмотрел на свою десктопную рабочую R7 350 и другую, XT 7870, требующую замены СО.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от robus

Я сделал так

Хм.. Может получится годным. Спасибо!

Не распарсил

Есть устаревший QGLWidget и новый QOpenGLWidget. Оба они, как я понял, приватно от меня занимаются обновлением картинки с учетом всех нюансов (рефреш рейт, вертикал синк и прочего). С моей стороны же нужно только дать им буфер (и своевременно его заполнять) из которого они сами забирают данные когда им вздумается. И это не совсем то, чего бы мне хотелось архитектурно.

deep-purple ★★★★★
()
Ответ на: комментарий от Deleted

Грустно посмотрел на свою десктопную рабочую R7 350 и другую, XT 7870, требующую замены СО.
R7 350

Она, судя по всему, на порядок другой (двоичный) быстрее, чем R7 440M. На моей 2Gb GDDR3, на твоей 2Gb GDDR5. Вычислительных блоков заметно больше.

robus ★★★★★
() автор топика
Последнее исправление: robus (всего исправлений: 1)
Ответ на: комментарий от Deleted

4 ГБ 512 блоков 128 бита.

Ну вот тем более. На моей Radeon R7 R440M 2Гб GDDR3 64 bit и 320 вычислительных блоков.

robus ★★★★★
() автор топика
Ответ на: комментарий от OpenMind

будет ли поддерживаться рендер на OpenGLES3, OpenGLES2 ну и для стареньких компов OpenGL2?

Поддержка OpenGLES вероятно будет, но не так уж скоро. Поддержка рендеринга через Vulkan — больший приоритет. Насчёт поддержки OpenGL2 — там другой синтаксис шейдеров, нет важных фич (фреймбуферы или vao например). То есть если и будет, то очень неэффективный и, возможно, не все фичи будут поддерживаться.

robus ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Ссылки на соры ведут на гуглокод, ссылки на примеры ведут на гуглокод. Что я там должен искать ещё?

В нескольких пикселях от ссылок на гуглокод, ссылка на зеркало. Там даже написано на разных языках: зеркало. Поздравляю, ты не прошёл тест.

И не притворяйся, про «спектрумовские» игры ты прекрасно понял, это то, что можно писать на чём угодно и играть хоть в псевдографике, хоть по телетайпу, хоть на утюге запускать, там считать и думать нечего. А новую игру написать - меняй текстуру, составляй новую карту и от тебе новая игра. (да, это касательно и 3д шутеров, только более затратно)

Ой, блин, утомил своей наивностью. Уже во времена гта вай сити 3д игры стали скатываться в Г. Тот же трансформер появился чуть позже вай сити, имел прекрасный 3Д ландшафт няшно смотрящийся на тех мониторах, а играть там можно было день-два и всё. Потому что игра представляет собой коридорную визульную новеллу с беганьем и стрельбой, от коридора, который диктуется сюжетом, хрен уклонишься, по городу, как в гэтэашке не поколбасишься - заплатил бабки, поставил игру и через 2 дня она протухла. Вот твои хорошие новые игры с текстурами и модельками. Не случайно сейчас новеллы снова на коне: зачем 3д модельки, если коридор сюжета можно сразу лепить на новелловском движке.

И это когда чудом получится что-то собрать и запустить и оно не вывалится с ошибкой.

А нефиг собирать ненужные компоненты, в поставке есть лишние, тестовые. Даже в системном опенгл не всё работает правильно, хотя над ним работала куча народа.

Даже клон майнкрафта на нём не напишешь, захлебнётся.

На паскале можно написать всё, если задаться такой целью и вбухать много сил и времени. Для критичных участков есть ассемблерные вставки - переписывай узкие места и наслаждайся скоростью. Другой вопрос, что ради клона майнкрафта это нафиг не нужно - зачем ещё один клон, который будет стоить дороже, т.к. оригинал создавался под фичи другого ЯП.

Napilnik ★★★★★
()
Ответ на: комментарий от robus

Только убунтоиды/федороиды. В нормальных дистрах собрать собственный пакет с нужной софтиной не проблема ни разу.

Ну, собери в центосе, или если глиб и К не той версии.

Napilnik ★★★★★
()
Ответ на: комментарий от robus

Брать qterminal, очевидно же.

А выбор кодировки у неё где? Сразу так и не найдёшь, а если нет, то искать придётся доооолго.

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

А выбор кодировки у неё где? Сразу так и не найдёшь, а если нет, то искать придётся доооолго.

Используется системная кодировка. Как поменять системную кодировку глобально, или для одного приложения рассказать? (спойлер: будет замешана переменная окружения LANG).

robus ★★★★★
() автор топика
Ответ на: комментарий от Napilnik

Вот твои хорошие новые игры с текстурами и модельками. Не случайно сейчас новеллы снова на коне: зачем 3д модельки, если коридор сюжета можно сразу лепить на новелловском движке.

Где «сюжетные коридоры» в Civilization V, VI? В Command & Conquer 3? В Grey Goo? В HoMM7? В Stellaris есть дороги в космосе (и у меня с этого очень горит), но «сюжетных коридоров» нет. Это всё — игры далеко не на 2-3 часа, а вышли, заметь, гораздо позже, чем GTA VC, когда по твоим заверениям «3д игры стали скатываться в Г».

Не случайно сейчас новеллы снова на коне: зачем 3д модельки, если коридор сюжета можно сразу лепить на новелловском движке.

Нет. Они на коне, потому что на коне инди. Ведь во многих инди командах не 3D дизайнера — на сколько я знаю, эти ребята редки и берут дорого.

На паскале можно написать всё, если задаться такой целью и вбухать много сил и времени.

И получить полу-мёртвую производительность, потому что по сравнению с ГЦ и ситуацией, когда виртуальное всё — и методы и даже наследование и даже небо, glActiveTexture + glBindTexture — это быстро, glBindFramebuffer — не катастрофа, и даже в glBegin упрёмся не со 100% гарантией.

Для критичных участков есть ассемблерные вставки - переписывай узкие места и наслаждайся скоростью

А, ну то есть C++ это ужас-ужас, а ассемблерные вставки в юзерспейсе — это норма?

robus ★★★★★
() автор топика
Ответ на: комментарий от robus

Используется системная кодировка. Как поменять системную кодировку глобально, или для одного приложения рассказать? (спойлер: будет замешана переменная окружения LANG).

Тьфу, примитив. Надо чтобы как в консоле менялась на ходу.

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

Тьфу, примитив. Надо чтобы как в консоле менялась на ходу.

Ну ок. Пользуйся KDE, только ради того, чтобы кодировку в терминале менять на лету (зачем бы тебе это ни было нужно).

robus ★★★★★
() автор топика
Ответ на: комментарий от robus

Где «сюжетные коридоры» в Civilization V, VI? В Command & Conquer 3? В Grey Goo? В HoMM7?

Кто все эти люди? Они действительно интересны;) По факту, играть особо не во что.

Это всё — игры далеко не на 2-3 часа, а вышли, заметь, гораздо позже, чем GTA VC, когда по твоим заверениям «3д игры стали скатываться в Г».

Вышли и пусть дальше идут, а играть особо и не во что.

Нет. Они на коне, потому что на коне инди. Ведь во многих инди командах не 3D дизайнера — на сколько я знаю, эти ребята редки и берут дорого.

Ты думаешь, хорошие 2Д художники абсолютно дешёвые? Если художник хорошо умеет в 2Д рисовать сиськи, то он может перенести их на масло с холстом и выставить на продажу за от 15К убитых енотов. И что интересно, многие такие работы проданы. Эти инди игры есть подражание с японских флешевых новелл с сиськоконтентом, арт из которых потом разлетается по сети и живёт своей жизнью. Флеш заменили письтоном и от этого вдруг «изобрёлся новый жанр».

И получить полу-мёртвую производительность

Ты зациклился на производительности. А управлять ей как будешь? Сделаешь враппер на плюсы, питон и луа. И зачем нам такой хоккей нужен? Ешьте сами свою производительность с которой колко работать.

А, ну то есть C++ это ужас-ужас, а ассемблерные вставки в юзерспейсе — это норма?

Как-бы от С++ наследуется интерфейс, с которым задолбаешься коннектиться, проблемы со сборкой и «пацаны, тут новые фичи завезли, налетайте, я вам в проект накидал!» Как на плюсах абстрагироваться он новья что завезли в заголовки, никто секрета так и не раскрыл. В результате, сборка на каждой системе грозит стать уникальной, со своими уникальными багами.

Napilnik ★★★★★
()
Ответ на: комментарий от robus

Ну ок. Пользуйся KDE, только ради того, чтобы кодировку в терминале менять на лету

А ещё в кедах обои красивые и konqueror с kwrite есть.

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

В нескольких пикселях от ссылок на гуглокод, ссылка на зеркало. Там даже написано на разных языках: зеркало. Поздравляю, ты не прошёл тест.

Я, как представитель старой школы, привык, что «зеркало» - это копия рабочего репозитария. Если головной проект умер - нафиг мне его мёртвая копия? Доктор сказал «в морг», значит в морг.

А нефиг собирать ненужные компоненты, в поставке есть лишние, тестовые.

Вот, кстати, хорошую тему затронул. Качаю я паскале проект какойнить - и ни в одном нет инструкции по сборке. Нет никакого «головного» файла проекта. Если я не автор и не разработчик, как мне собрать непонятно что? Это в паскалепроектах бесит.

На паскале можно написать всё, если задаться такой целью и вбухать много сил и времени.

Да. Можно даже наклеить два миллиона бумажных кубиков, или асбеста замесить и отштамповать, раскрасить и играть в реальном времени миниатюрными роботиками с искусственным интеллектом. Но спор-то был про то, что надо выкинуть плюсы и кути, ибо гораздо проще всё сделать на паскале. Я принимаю твоё поражение и рад, что ты не стал вилять ещё одну неделю и признал поражение. Через два-три технологических скачка, когда компы смогут гонять в браузере виртуалку с линуксом, а в нём браузер с жабоскриптовым майнкрафтоклоном, на паскале как раз напишут свою версию майнкрафтоклоном.

Deleted
()
Ответ на: комментарий от Napilnik

Ты думаешь, хорошие 2Д художники абсолютно дешёвые? Если художник хорошо умеет в 2Д рисовать сиськи, то он может перенести их на масло с холстом и выставить на продажу за от 15К убитых енотов.

Но тем не менее, 3D дизайнеров катастрофически меньше, чем 2D дизайнеров.

Как на плюсах абстрагироваться он новья что завезли в заголовки, никто секрета так и не раскрыл.

Одни уже абстрагировались. До сих пор на c++14 перейти не могут..

robus ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Я, как представитель старой школы, привык, что «зеркало» - это копия рабочего репозитария.

Спасибо, насмешил - Петросян в шоке. Зеркало, это копия любой файлопомойки с выложенным контентом. Любой. Виндузятники качальщики подтвердят. То что ты все файлопомойки считаешь репозиториями, который один, согласно повелению Линуча Торвальдса написавшего гит, это твои личные проблемы. Тем более что там не гит был, а свн - поводов применять гитовское мировоззрение нет абсолютно.

Вот, кстати, хорошую тему затронул. Качаю я паскале проект какойнить - и ни в одном нет инструкции по сборке. Нет никакого «головного» файла проекта. Если я не автор и не разработчик, как мне собрать непонятно что? Это в паскалепроектах бесит.

А головных может быть несколько, я сам так делать люблю:)))) Правило простое, то что модуль (содержит слово UNIT с названием, похожим на имя файла, в начале кода) или динамическая библиотека (library с названием), то не головной проект _программы_, а у лазарусных проектов свой заголовочный файл, но параллельно ему можно и другой заголовочный сбоку параллельно прикрутить, для сборки не через лазарус - полная свобода творчества! Кто сам такое пишет, тот разберётся.

Но спор-то был про то, что надо выкинуть плюсы и кути, ибо гораздо проще всё сделать на паскале.

Не проще, а изделие выйдет более полезное: взял и собрал, взял и на другой компилятор перенёс. Плюсы дороги в обслуживании (вот ты полезешь чинить код, если у тебя вдруг не станет собираться), а тут и так уже народ подразбежался, один разраб остался. Пусть пилит, если есть с этого фан. Но работы там много, а фан может исчезнуть. У комерсов хоть дополнительный стимул есть. И что получат пользователи, которые рискнут этим движком пользоваться но не готовы его чинить и патчить;)

Я принимаю твоё поражение и рад, что ты не стал вилять ещё одну неделю и признал поражение.

У тебя глюки, никакого поражения я не признавал.

Через два-три технологических скачка, когда компы смогут гонять в браузере виртуалку с линуксом, а в нём браузер с жабоскриптовым майнкрафтоклоном, на паскале как раз напишут свою версию майнкрафтоклоном.

Можно нескромный вопрос: а нахрена майнкрафт? У меня есть предположение, что паскалистам это неинтересно, паскалевский код круче вашего майкрафта, в него интереснее погружаться.

Napilnik ★★★★★
()
Ответ на: комментарий от Deleted

Кстати, когда-то зарождался свой десктоп на паскале, наверное не взлетел? Тут как-то тихо http://wiki.freepascal.org/Lazarus_Desktop_Environment

В первый раз слышу, но смысла особого не нахожу. Размеры оперативки тогда увеличивались сильно, а специализированная среда, как кедам, лазарусным программам не нужна - пусть другие рендеринг шрифтов чинят:)

Napilnik ★★★★★
()
Ответ на: комментарий от robus

Но тем не менее, 3D дизайнеров катастрофически меньше, чем 2D дизайнеров.

Нужны не просто дизайнеры, а художники, без них 100 арта хорошо не получится. 2Д дизайнеру нужно лишь иметь какие-то худнаклонности и быть не очень умным, или уметь таким прикидываться, чтобы его работы лучше понимали массы. А при работе с модельками это ещё и нужно совмещать с более техногенной хренотенью, то есть сидеть на двух стульях.

Одни уже абстрагировались. До сих пор на c++14 перейти не могут..

Какие сложности, когда стандарты спускают вниз корпорации по своему хотению.

Napilnik ★★★★★
()
Ответ на: комментарий от robus

Не пробовал вырубить интеграшку и подрубить внешнюю видеокарту (если есть)?

Это из-за Vega сбои или и сам проц сбоит в kernel panic'и?

Deleted
()
Ответ на: комментарий от Deleted

Чаще :) Где то 3/4 всех загрузок — успешные.

robus ★★★★★
() автор топика
14 января 2019 г.
Ответ на: комментарий от hobbit

Уж не знаю, что там в проприетарном компиляторе + рантайме object pascal, но во free pascal точно есть garbage collector.

robus ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.