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

Legit frame graph (2 стр)

Страницы: 1 2
#15
3:47, 11 мар 2020

MrShoor
> legit::RenderGraph::RenderPassDesc() - можно было бы не писать, а
> конструировать внутри AddPass в перегруженной функции с таким же названием.
так было изначально и там всё ещё есть перегруженный метод:

    void AddRenderPass(
      std::vector<ImageViewProxyId> colorAttachmentImageProxies,
      ImageViewProxyId depthAttachmentImageProxy,
      std::vector<ImageViewProxyId> inputImageViewProxies,
      vk::Extent2D renderAreaExtent,
      vk::AttachmentLoadOp loadOp,
      std::function<void(RenderPassContext)> recordFunc);

отстой в том, что вовсе не все аргументы нужны всегда. например, ты можешь сделать рендерпасс без depthAttachment'а или без colorAttachment'а или даже без record function'а. по идее, все аргументы здесь — опциональные.

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

.SetColorAttachments({
  { frameInfo.swapchainImageViewProxyId, vk::AttachmentLoadOp::eDontCare },
  { gBufferNormalsProxyId, vk::AttachmentLoadOp::eLoad } })

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

> BeginFrame и EndFrame смущают, я бы предпочел явный вызов Execute вместо неявного на EndFrame. Да и сама концепция парных вызовов - не очень как по мне, и если уж очень хочется парных вызовов, то я бы предпочел что-то в духе:
> auto frameInfo = inFlightQueue->FrameStart();
> frameInfo.Finish();
я согласен, я тоже очень не люблю парные вызовы. если ты посмотришь, то в https://github.com/Raikiri/LegitEngine/blob/master/src/LegitVulka… resentQueue.h сделано именно так: есть просто Execute(), а BeginFrame'а вообще нету. сложность заключается в том, что InFlightQueue занимается double buffering'ом ресурсов, ассоциированных с каждым frame-in-flight, поэтому ресурсы, ассоциированные в фреймом, каждый кадр используются разные (circular buffer). Для их получения используется BeginFrame(). я бы тоже всё это в автоматический scoped guard затолкал, если бы была возможность. особенность в том, что Start() и Finish() вовсе не всегда находятся в одном scope'е, поэтому сделано через отдельные методы, хотя ничто не мешает сделать автоматический scope guard, который будет вызывать Start в конструкторе и Finish в деструкторе. на самом деле именно так сделаны многие другие системы вроде, например, автоматического профайлера: https://github.com/Raikiri/LegitEngine/blob/master/src/LegitVulka… tQueue.h#L132

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

#16
4:47, 11 мар 2020

А для чего все эти Proxy нужны?

#17
5:24, 11 мар 2020

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

#18
11:19, 11 мар 2020

Suslik
> потому что каждому пассу для рендеринга на самом деле нужны не сами текстуры, а
> текстуры, удовлетворяющие запрошенным им параметрами.
т.е. если на протяжении кадра существую две текстуры с разными параметрами, но одинаковым типом памяти, и время их жизни не пересекается, то эти текстуры будут размещены в разных областях памяти, а не в одной и той же?

#19
12:22, 11 мар 2020

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

#20
13:56, 11 мар 2020

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

#21
20:06, 12 мар 2020

Suslik
А вы не планируете исходники травы выкладывать?

#22
6:11, 13 мар 2020

AlexeyLarin
> А вы не планируете исходники травы выкладывать?
сам шейдер можно вытащить из path of exile, используя resource unpacker. но чтобы его использовать правильно, нужно понимать, что он делает.

Страницы: 1 2
ПрограммированиеФорумГрафика

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