Как вы делаете рендеринг в своем движке? Пишете одну большую функцию, в которой последовательно выполняются все нужные шаги - переключение стейтов, рендер таргетов, текстур, шейдеров и сама отрисовка? Или же делаете кучу мелких классов, каждый из которых отвечает за небольшой шаг во всем этом безобразии?
Раньше я делал по второму варианту, но как оказалось это весьма неудобно. Изменения стейтов распыляются по классам, получаются лишние вызовы dx\ogl, непонятно какой рендер-таргет сейчас подключен и во что идет рисование. Первый вариант подкупает своей прозрачностью в действиях, поэтому я остановился на нем - в одном методе расписан весь процесс рендера без всяких вложенностей. А так как dx\ogl стейт-машины, то всегда знаешь в каком состоянии она находится.
mr.DIMAS
> Изменения стейтов распыляются по классам, получаются лишние вызовы dx\ogl,
> непонятно какой рендер-таргет сейчас подключен и во что идет рисование.
DX12 - PipelineState и нет такой проблемы :) В вулкане аналогично.
ArchiDevil
> DX12 - PipelineState и нет такой проблемы
Зато куча иных проблем?
mr.DIMAS
Data-Driven
Я делаю несколько структурок с кучей стейтов. Передаю её в метод SetState класса AGraphics и он устанавливает все нужные стейты оттуда, делая проверки: если какой-то стейт уже установлен, то не устанавливает.
Весь код, специфичный для GAPI, сосредоточен в соответствующем наследнике абстрактного класса AGraphics, который знает всё о стейтах GAPI и существующих в нём объектах: текстурах, буферах и т. д..
Но судя по всему, кроме меня так никто не делает. По-моему все делают более мелкие классы типа TextureGL, BufferGL и т.д..
innuendo
> Data-Driven
+1
mr.DIMAS
Я даже чуть-чуть описывал здесь в блоге. Правда, в связи с выходом DX12 и прочих низкоуровневых GAPI, мой рендер может потребовать пересмотрения.
mr.DIMAS
> Как вы делаете рендеринг в своем движке? Пишете одну большую функцию, в которой последовательно выполняются все нужные шаги - переключение стейтов, > > рендер таргетов, текстур, шейдеров и сама отрисовка? Или же делаете кучу мелких классов, каждый из которых отвечает за небольшой шаг во всем этом >безобразии?
Мелкие классы будут, но они служат в основном в качестве хранения. Установками и переключениями занимается RenderSystem, и да, Data-Driven очень правильный подход. Все настройки можно зачитать из файла и настроить систему рендеринга.
gammaker
> Весь код, специф ичный для GAPI, сосредоточен в соответствующем наследнике абстрактного класса AGraphics, который знает всё о стейтах GAPI и существующих
> в нём объектах: текстурах, буферах и т. д.. Но судя по всему, кроме меня так никто не делает. По-моему все делают более мелкие классы типа TextureGL, BufferGL > и т.д..
Ну почему же дак я тоже делаю.
Подкиньте статей по data-driven применительно к рендерингу, аж прям интересно стало.
Andrey
> Data-Driven очень правильный подход. Все настройки можно зачитать из файла и
> настроить систему рендеринга.
Это не тот DD
mr.DIMAS
> А так как dx\ogl стейт-машины, то всегда знаешь в каком состоянии она
> находится.
И да, после того, как пакет данных отрисован делается flush - сброс стейтов/байндингов в дефолтное состояние чтобы ничего не подвисло :)
Ага, и получаем дикие тормоза. Так не делают.
mr.DIMAS
> Ага, и получаем дикие тормоза.
Естественно, что не после каждого DrawCall :)
> Так не делают.
Да, кто так не делает получает большой геморрой с крашами и багами. Слухай бородатого дядьку :)
mr.DIMAS
> Подкиньте статей по data-driven применительно к рендерингу, аж прям интересно стало.
В этом блоге много всего полезного по data-driven и не только.
innuendo
> И да, после того, как пакет данных отрисован делается flush - сброс
> стейтов/байндингов в дефолтное состояние чтобы ничего не подвисло :)
А в чём проблема просто следить за тем, какой стейт текущий? А то периодический сброс выглядит как какой-то костыль, чтобы замаскировать баги, а не исправить их. Другое дело, если делать это каждый draw call, но очевидно, что это тормозно.
gammaker
> А в чём проблема просто следить за тем, какой стейт текущий? А
Речь не только про стейты, но и про ресурсы. Тебе сколько раз приходилось работать с чужим кодом ? Я про 3D
innuendo
> сброс стейтов/байндингов в дефолтное состояние
самое бесполезное занятие
C каких пор DX стал стейт-машиной?
Тема в архиве.