Настройка работы с буфером глубины

Обсуждение специальной версии Magic Particles (Dev), предназначенной для разработчиков игр.

Настройка работы с буфером глубины

Сообщение Anton Petrov » Пн дек 04, 2017 12:11 am

1. Как сделать, чтобы 3D эффект "пересекался" или "обволакивал" 3D модель в игре? То есть по сути я хочу чтобы материал использовал флаг MAGIC_MATERIAL_ZENABLE, но мне пока не удалось его включить из редактора, поэтому визуально эффект рисуется либо поверх 3D модели, либо под ней в зависимости от порядка отрисовки.

2. В каких случаях в материале устанавливаются флаги MAGIC_MATERIAL_ZENABLE и MAGIC_MATERIAL_ZWRITE?

3. Правильно ли я понимаю что Magic_EnableZBuffer() влияет только на то сортируются ли частицы по глубине или нет?
Anton Petrov
 
Сообщения: 12
Зарегистрирован: Ср ноя 29, 2017 11:36 pm

Re: Настройка работы с буфером глубины

Сообщение Odin_KG » Пн дек 04, 2017 1:49 am

В редакторе нет флага для Z-buffer-а.

Вообще логика такая... для прозрачных текстур Z-buffer не имеет смысла, поэтому заполнение Z-buffer-а MAGIC_MATERIAL_ZWRITE включается только для ситуаций, когда отключен альфа-канал (тип смешивания "непрозрачность" или "маска"). И тогда же включается MAGIC_MATERIAL_ZENABLE, так как это требуется для правильного рисования эффекта.

В своем проекте вам нужно включить проверку на Z-buffer (MAGIC_MATERIAL_ZENABLE) и, собственно, всё. Я это считаю "внешней операцией", которая выполняется вами, когда она вам нужна.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

Re: Настройка работы с буфером глубины

Сообщение Anton Petrov » Пн дек 04, 2017 10:02 am

Odin_KG писал(а):В редакторе нет флага для Z-buffer-а.

Вообще логика такая... для прозрачных текстур Z-buffer не имеет смысла, поэтому заполнение Z-buffer-а MAGIC_MATERIAL_ZWRITE включается только для ситуаций, когда отключен альфа-канал (тип смешивания "непрозрачность" или "маска"). И тогда же включается MAGIC_MATERIAL_ZENABLE, так как это требуется для правильного рисования эффекта.

В своем проекте вам нужно включить проверку на Z-buffer (MAGIC_MATERIAL_ZENABLE) и, собственно, всё. Я это считаю "внешней операцией", которая выполняется вами, когда она вам нужна.


Ваш пример мне понятен, но есть другой типичный случай: например, дым из выхлопной трубы машины. Если машина будет активно двигаться и вертеться, то частицы дыма окажутся буквально вокруг машины, обволакивая ее. Чтобы корректно нарисовать такой 3D дым мне нужно включить MAGIC_MATERIAL_ZENABLE, то есть включить тест буфера глубины, но запись в буфер глубины мне не нужна. При таком режиме рисования (конечно дым надо рендерить после рендеринга машинки), когда включен тест буфера глубины часть частиц дыма окажутся позади машинки, а часть перед машинкой, а какая-то часть будет пересекать геометрию машинки, но это и есть желаемый результат.

Обычно для таких эффектов нужна и сортировка частиц по камере, особенно если эффект не аддитивный, а с нормальным альфа-блендингом, чтобы нарисовать их в порядке от дальней к ближней.
Anton Petrov
 
Сообщения: 12
Зарегистрирован: Ср ноя 29, 2017 11:36 pm

Re: Настройка работы с буфером глубины

Сообщение Odin_KG » Пн дек 04, 2017 10:37 am

Если машина будет активно двигаться и вертеться, то частицы дыма окажутся буквально вокруг машины, обволакивая ее. Чтобы корректно нарисовать такой 3D дым мне нужно включить MAGIC_MATERIAL_ZENABLE, то есть включить тест буфера глубины, но запись в буфер глубины мне не нужна

Так я вам про это и говорю - вы должны включать на видеокарте проверку на Z-буфер по собственному усмотрению. Если частицы непрозрачные, то они сами включат эту проверку через MAGIC_MATERIAL_ZENABLE (если это не запрещено намеренно через Magic_EnableZBuffer()).

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

В редакторе включается сортировка по камере под сценой.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

Re: Настройка работы с буфером глубины

Сообщение Anton Petrov » Пн дек 04, 2017 12:49 pm

Odin_KG писал(а):Так я вам про это и говорю - вы должны включать на видеокарте проверку на Z-буфер по собственному усмотрению. Если частицы непрозрачные, то они сами включат эту проверку через MAGIC_MATERIAL_ZENABLE (если это не запрещено намеренно через Magic_EnableZBuffer()).


А, понятно, НО... :)
Это свойство (тест глубины) специфично для разных эффектов, то есть возможно для каких-то его захочется включить, а для каких-то нет.
Но через API не так очевидно какой материал хакать и подкладывать MAGIC_MATERIAL_ZENABLE потому что разные эффекты могут реюзать один и тот же материал.
В общем я понял, что сейчас придется решать своими силами :(
Anton Petrov
 
Сообщения: 12
Зарегистрирован: Ср ноя 29, 2017 11:36 pm

Re: Настройка работы с буфером глубины

Сообщение Odin_KG » Пн дек 04, 2017 1:28 pm

В общем я понял, что сейчас придется решать своими силами :(

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

Но через API не так очевидно какой материал хакать и подкладывать MAGIC_MATERIAL_ZENABLE потому что разные эффекты могут реюзать один и тот же материал.

Ну, добавьте свой флаг z_enabled, когда вы этот материал устанавливаете в видеокарту.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

Re: Настройка работы с буфером глубины

Сообщение Anton Petrov » Вт дек 05, 2017 12:06 am

Odin_KG писал(а):Не понимаю, в чем тут проблема. Включаете проверку на Z для всех эффектов на игровой сцене и всё. Ничего другого тут изобретать нет смысла.

Для всех эффектов не надо. Например, для 2D эффектов в интерфейсе, там включенный тест глубины приведет к глюкам, когда нарисованные в zBuffer объекты 3D сцены заблокируют отрисовку пикселей 2D эффекта в интерфейсе.

Odin_KG писал(а):Ну, добавьте свой флаг z_enabled, когда вы этот материал устанавливаете в видеокарту.

Наш рендеринг API работает поверх D3D11 и Metal, где нельзя что-то включить как в OpenGL одной строчкой. В этих API есть DepthStencilState который входит в боле общий RenderState объект и для каждого материала MagicParticles подготавливается свой RenderState объект. Получается что в момент подготовки материала я не знаю точно нужен или нет флаг z_enabled, а в момент рендеринга эффекта с этим материалом будет уже поздно - RenderState для материала создан.

Это решается если я для каждого материала буду создавать два почти одинаковых RenderState объекта, которые отличаются лишь флагом z_enabled, а потом буду выбирать один из них в зависимости от настроек отрисовываемого эмиттера. Это создает издержки :)
Anton Petrov
 
Сообщения: 12
Зарегистрирован: Ср ноя 29, 2017 11:36 pm

Re: Настройка работы с буфером глубины

Сообщение Odin_KG » Вт дек 05, 2017 10:37 am

Я понимаю, что в вашем случае материал цельный. Но идея добавлять к себе редактор кнопочку "принудительно включить Z-буфер" мне не очень нравится. Во-первых, единственное место, куда её можно поставить - это линия с кнопками под сценой, так как только эта "линия" существует и для простых эмиттеров и для анимированных папок. Во-вторых, значение такой кнопки чисто техническое, а редактором пользуются в основном художники (большая половина вообще не поймет, зачем эта кнопка нужна). В третьих, это в любом случае настройка именно игры, и логично её делать там и какая-то проблема тут возникает только из-за монолитности материалов в некоторых графических API, а не из-за здравого смысла.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm


Вернуться в Magic API

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron