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.

★★★★

А в чём принципиальная новизна? Разве «деревья» объектов это какое-то ноу-хау?

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

Это само-стеб такой. «Принципиально новая технология, не имеющая аналогов в моём подъезде» :D

robus ★★★★ ()

ZenitharChampion, слушай у меня на NVIDIA GT650M с самым свежим драйвером, Мисака (ogl 4.5 рендер) в тыкву превратилась (рендерит без текстур, не реагирует на переключение/изменение камеры), на mesa всё норм. Можешь, плз, посмотреть воспроизводится/не воспроизводится, из-за чего оно так.

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

А может кто-нибудь объяснить пожалуйста насчет шейдеров: вот есть разные API (OpenGL, Vulkan, DX). Как я понимаю, разработчики не пишут несколько имплементаций (если я правильно понимаю это слово) шейдеров под разные API. Получается, что они пишут какой-то один язык, который транслируется в нативные форматы шейдеров?

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

Это часть моей сабжевой поделки OpenGL 4.5 рендер. И в нём бага (грешу на bindless_texture) из-за которой всё плохо (но на mesa, почему-то нет).

Не знаешь, так писать можно, или это только меса переварит?

#version 450 core
#extension GL_ARB_bindless_texture:require

layout(std140, binding=2) uniform SIB_MATERIAL
{
    vec4 bg;
    vec4 diffuse;
    vec4 specular;
};

layout(std140,binding=7) uniform SIB_MODELS_TEXTURES
{
    uvec2 tex_handle;
};

sampler2D tex=sampler2D(tex_handle);

vec4 getTexel_TextureHelper(in vec2 texCoord)
{
    return texture(tex,texCoord);
}

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

Получается, что они пишут какой-то один язык, который транслируется в нативные форматы шейдеров?

Есть разные языки шейдеров: glsl, hlsl, cg и другие.

В OpenGL можно использовать только glsl, в DirectX (на сколько мне известно) только hlsl, в Vulkan — SpirV (в который с успехом транслируется GLSL и, вроде как, HLSL).

В сабже слегка расширенный glsl, так как и для vulkan и для OpenGL он подходит. Рендера на DirectX в ближайшем будующем не планируется.

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

Когда будут опенсорс целиком душить, она бы тоже под раздачу попала. Если бы «_злу_» была нужна конкретно она, сваливание на другой хостинг ни разу не спасло бы.

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

Я конечно понимаю, что у C++ убогая экосистема и STD, но тянуть Qt в 3D движок - это перебор даже для меня.

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

Upd: пока что не могу проверить! У меня драйвер 358 сейчас. Без Вулкана.

У меня с OpenGL проблема. Вероятнее всего, это мой косяк — вопрос, где.

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

Я конечно понимаю, что у C++ убогая экосистема и STD, но тянуть Qt в 3D движок - это перебор даже для меня.

Он там только ради рефлексии.

robus ★★★★ ()

О, чойта интересное. Успехов.

Но зачем такое разделение, движок, рендерер, плагины, потом такой ад всё это вместе собрать, что кроме автора никто не разберётся. Лучше всё в одной репе собрать.

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

QtCore и так, вероятнее всего, уже установлен в системе, ибо на нём (Qt) написано огромное количество хорошего Gui софта.

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

Целая тётка? Кстати, вроде как, ноги светлее, руки темнее должны быть, не? Т что за проблема с юбкой? А где нодовый редактор шейдеров? А редактор анимаций? А смешивание скелетных анимаций? А IK в риалтайме с физикой? А генерация граундов с туннелями? А воксельная генерация с маршинг кубасами? А поддержка луашарпитонов? а полная IDE с менеджментом проректа и со сборкой проекта во множество платформ? А остальные ништяки? :)

Удачи ещё раз. Тяжёлая тебе работа предстоит. :)

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

Эту тян нагенерила программа makehuman за 5 минут (из них 4 минуты запускался). Я не знаю, почему она генерит пупсов и как сделать на ней эччи/хентай.

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

А рендеры у тебя где выбираться будут? А то сходу в этой мешанине не могу найти.

Пока что хватает первый попавшийся. Как только рендеров станет больше одного, добавлю environment variable для того, чтобы конечный пользователь мог выбирать.

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

Ну нас целая команда была.. когда я всё это затеял. А потом народ отвалился.

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

:) Это моделька такая. Никакой арматуры в двигле ещё нет.

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

Ну вот. А выше по треду предлагают выкинуть Qt из зависимостей, чтобы даже такие базовые вещи, как рефлексия/события/сигналы-слоты велосипедить.

robus ★★★★ ()

Надо было на расте писать, а так ненужно ибо в расте есть такая хорошая вещь для движков как specs(Amethyst уже юзает specs)

Да и если приниципиально новый, зачем на приниципиально старом ЯП пилить?))

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

Дураков не слушай. Хочешь использовать? Используй. Кути облегчают жизнь программисту? Бери и не думай. А пользователи, которые нос воротят от определённых туллкитов и языков программирования - пусть идут к доктору.

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

Дураков не слушай. Хочешь использовать? Используй. Кути облегчают жизнь программисту? Бери и не думай.

Я и не собираюсь такой мощный рефакторинг этой бандуры делать. И хотя глядя на всю эту высокотехнологичную (я надеюсь) иб*лу, анон может решить, что мне нефиг делать, мне не _настолько_ нефиг делать, чтобы рефакторить из-за тулкитофобии.

Бери и не думай.
не думай

Фиговый совет. Но я то перед тем, как взять, подумал :)

А пользователи, которые нос воротят от определённых туллкитов и языков программирования - пусть идут к доктору.

Самое забавное, что юзеры готовы ставить себе целый моно, ради 3д движков (Unity, Unreal Engine). И хотя те движки — очевидные топчики-лидеры, но и я в будущем туда мечу )

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

зачем на приниципиально старом ЯП пилить
c++17, планируется переход на c++20 сразу после выхода стандарта
приниципиально старый ЯП

окаай.

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

Таки раст в 6 месяцев обновляется, а С++

А с++ ставится в /usr, а не в хомяк. А ещё он не таскает все зависимости внутри единственного эльфа. А ещё там есть VulkanHPP. А ещё cmake с его find_package.

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

Но вообще мне кажется на расте пилить игрушки легче, на игру типа этого у меня ушел один вечерок,а на этот давно заброшенный движок если его таковым можно назвать 3 дня ушло с осиливанием документации по gfx-rs

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

Ccылка битая, должно быть https://gitlab.com/playX/SpaceShooter

И по ней игрулина, а не движок общего назначения.

Кстати, через какое-то время, когда мой движок будет хоть немного готов, не желаешь игру на нём сделать?

Но вообще мне кажется на расте пилить игрушки легче

А было ли так год назад, когда я только выбирал технологический стек?

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

Ну я вроде базисы C++ осилил, игры писать пытался на чистейшем OpenGL, но попробовать могу :)

И по ней игрулина, а не движок общего назначения.

Там я еще ссылку кинул на мой псевдо движок, уж месяц как забросил, пилю свой ЯП

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

У раста есть Vulkano и GFX-RS для вулкана и оба вполне пригодны + есть jakar engine

Спасибо, буду знать. Как там с динамической линковкой? Вообще можно ли смешивать в одной программе модули, написанные на расте и на других языках? Задумываюсь о биндингах своего api для раста.

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

Можно биндить код написанный на C, а вот код написаный на C++ вроде никак, только если делать биндинг этого кода к С.

А для дин.либ я юзаб cdylib(надо добавить в Cargo.toml это:

[lib]
type="cdylib"

)
Позволяет таскать с собой все прилинкованые к бинарнику либы, подробнее прочесть можно здесь

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

Там я еще ссылку кинул на мой псевдо движок
graphics::circle(ctx, DrawMode::Fill, Point2::new(self.pos_x, 380.0), 100.0, 2.0)?;

А он разве трёхмерный? Ну не гибридный же, как юнити?

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

код написаный на C++ вроде никак, только если делать биндинг этого кода к С

Грустненько. Заставляет крепко призадуматься на тему того, как будет выглядеть публичное апи на не c++.

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

Трехмерность была в планах, на той стадии что сейчас можно только рисовать благодаря vertex'am что находяться по пути в src/graphics/pipeline.rs, если постараться можно склепать простую 3d игру

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