Войти
ПрограммированиеФорумГрафика

Legit frame graph

Страницы: 1 2 Следующая »
#0
18:43, 9 мар 2020

Выложил свой vulkan frame graph/render graph в открытый доступ: https://github.com/Raikiri/LegitEngine

Также в репозитории реализованные на нём  screenspace GI, shrodinger hydrodynamics и пара других интересных алгоритмов:
Изображение
Изображение
Изображение

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

Пример минимального кода с созданием окна, ядра со всякими слоями валидации, созданием in-flight queue, свопчейна и отрисовкой квада на весь экран через рендерграф:

GLFWwindow* window = glfwCreateWindow(1024, 1024, "Legit Vulkan renderer", nullptr, nullptr);
  
const char* glfwExtensions[] = { "VK_KHR_surface", "VK_KHR_win32_surface" };
uint32_t glfwExtensionCount = 2;

legit::WindowDesc windowDesc = {};
windowDesc.hInstance = GetModuleHandle(NULL);
windowDesc.hWnd = glfwGetWin32Window(window);

auto core = std::make_unique<legit::Core>(glfwExtensions, glfwExtensionCount, &windowDesc, true);

while (glfwWindowShouldClose(window))
{
  glfwPollEvents();
  if (!inFlightQueue)
  {
    core->ClearCaches();
    inFlightQueue = std::unique_ptr<legit::InFlightQueue>(new legit::InFlightQueue(core.get(), windowDesc, 2, vk::PresentModeKHR::eMailbox));
  }
  
  try
  {
    auto frameInfo = inFlightQueue->BeginFrame();
    {
      core->GetRenderGraph()->AddPass(legit::RenderGraph::RenderPassDesc()
        .SetColorAttachments({ { frameInfo.swapchainImageViewProxyId, vk::AttachmentLoadOp::eDontCare } })
        .SetRenderAreaExtent(this->viewportExtent)
        .SetRecordFunc([this](legit::RenderGraph::RenderPassContext passContext)
      {
        auto pipeineInfo = core->GetPipelineCache()->BindGraphicsPipeline(passContext.GetCommandBuffer(), passContext.GetRenderPass()->GetHandle(), legit::DepthSettings::Disabled(), { legit::BlendSettings::Opaque() }, legit::VertexDeclaration(), vk::PrimitiveTopology::eTriangleFan, shader.program.get());
        passContext.GetCommandBuffer().draw(4, 1, 0, 0);
      }));
    }
    inFlightQueue->EndFrame();
  }
  catch (vk::OutOfDateKHRError err)
  {
    core->WaitIdle();
    inFlightQueue.reset();
  }
}
core->WaitIdle();

glfwDestroyWindow(window);
#1
21:37, 9 мар 2020

Изучаю Vulkan и могу сказать, что много времени уходит именно на то, чтобы понять как именно это всё красиво обернуть (часто задача напоминает "напиши себе сам OpenGL, свой, личный, уютный").
Не столько интересны демки, сколько архитектура. Код очень читабельный, буду подглядывать, спасибо.

#2
21:56, 9 мар 2020

как это собирать без ImGuiUtils ?

#3
5:12, 10 мар 2020

BingoBongo
> как это собирать без ImGuiUtils ?
в принципе достаточно только взять папку LegitVulkan, так как именно там находится сам фреймворк. хотя я его выкладывал в первую очередь для того, чтобы люди могли ориентироваться на мой код, а не использовать у себя. мол, посмотреть, как можно решить такую-то архитектурную проблему, и сделать в итоге по-своему.

#4
10:13, 10 мар 2020

Однако, основная цель, с которой я выкладываю — это поделиться своими находками в архитектуре рендера.

Если можно кратко и простыми словами, что за находки ?


PS: Legit frame graph = законный граф кадра ?! Дикий запад: закон и порядок .

#5
10:26, 10 мар 2020

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

#6
11:30, 10 мар 2020

Suslik
> отрисовкой квада на весь экран через рендерграф
больше пяти строк на функцию вышло
"Миша все гавно, давай по новой" (с)

#7
18:09, 10 мар 2020

И не стыдно писать такой говнокод?

#8
19:11, 10 мар 2020

v1c
Было бы стыдно, если бы он не работал.

#9
19:12, 10 мар 2020

v1c
Ну и давай пример "не говнокода", посмотрим.

#10
19:20, 10 мар 2020

nes
> Ну и давай пример "не говнокода", посмотрим.
vulkan-tutorial.com

#11
19:24, 10 мар 2020

programina
Ну ты бы еще написала "Эти ваши интернеты",
конкретику давай.

#12
1:21, 11 мар 2020

v1c
Suslik и не позиционировал в 0-м посте это всё как священный продакшн-реди код.
Лучше сделать что-то работающее и потом оптимизировать, чем изначально вечно вылизывать до последней ASM инструкции. Но ты, ведь, написав про говнокод, и так должен это хорошо знать, да? :)

#13
1:41, 11 мар 2020

Suslik
> хотя я его выкладывал в первую очередь для того, чтобы люди могли
> ориентироваться на мой код, а не использовать у себя.
У тебя там наработок очень много, а объяснений архитектуры очень мало. Поэтому большой соблазн просто взять и пользоваться.
Из того, что я вижу:
legit::RenderGraph::RenderPassDesc() - можно было бы не писать, а конструировать внутри AddPass в перегруженной функции с таким же названием.

.SetColorAttachments({ { frameInfo.swapchainImageViewProxyId, vk::AttachmentLoadOp::eDontCare } }) - не понял, что тут происходит собственно? У тебя там свой свопчейн создался глобальный на core, и ты типа в него рисуешь? Я бы тогда делал как-то так: SetColorAttachments( core->GetSwapchainAttachments() );

.SetRenderAreaExtent(this->viewportExtent) - в 95% случаев я рисую во всю текстуру. Можно было бы по умолчанию брать вьюпорт из текущих аттачментов.

auto pipeineInfo = core->GetPipelineCache()->BindGraphicsPipeline... - я бы предпочел создавать эти пайплайны отдельно, а не пихать в функцию 100500 параметров.

BeginFrame и EndFrame смущают, я бы предпочел явный вызов Execute вместо неявного на EndFrame. Да и сама концепция парных вызовов - не очень как по мне, и если уж очень хочется парных вызовов, то я бы предпочел что-то в духе:

auto frameInfo = inFlightQueue->FrameStart();
frameInfo.Finish();
#14
2:33, 11 мар 2020

programina
> vulkan-tutorial.com
ммм, это ужасный туториал - писать вывод треугольника в том же месте где и выбор девайса.... автор туториала вообще не умеет в правильную архитектуру (и не надо про то что это урок - после этого урока как раз больше вопросов так как совершенно непонятно как этот говнокод перестроить чтобы вывести два треугольника, потом куб, потом сцену...)

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.