×
Menu

Stencil effects - additional notes

Основная статья: NiStencilProperty.
 
Важно!
Что работало, внезапно может перестать работать. ^-^
Может быть связано с глюками драйверов, или же с порядком объектов в сцене.
Т.е. последовательность размещения объектов в редакторе, может оказывать критически важный эффект!
Свойства трафарета крайне чувствительны к последовательности загрузки!
Но если в локальном файле его легко исправить, прописав "монитор" выше "маскируемых" объектов в списке.
В игре с этим могут возникать проблемы.
Например, игра может размещать модели с частицами не в том порядке, в котором это было сделано в редакторе!
 
Если что-то стабильно работало, но после добавления нового объекта перестало; удалите новые объекты из сцены.
Перезапустите редактор и попробуйте разместить снова.
"Мониторы" должны быть ВСЕГДА выше в списке, чем их "изображения".
Т.е. крайней важен порядок вызова объектов в сцене ниф файла, равно как и в глобальных графиках сцен в игре!
Если что-то отвалилось, вызывайте SSG и смотрите в каком месте располагается объект.
В начале графика (сцены ячейки) или внизу оного.
Это важно!
 
Обратите внимание!
В редакторе объекты со стенсильными свойствами отображаются НЕ КОРРЕКТНО!
Т.е. нельзя однозначно ориентироваться на то, что показывает редактор.
Это "нормально", т.к. редактор обновляет буфер кадров только при масштабировании окна.
Потяните окно рендеринга сцены за уголок и картинка покажет правильное состояние объектов, убрав "артефакты".
Однако!
В сцене редактора и в сцене игры объекты могут поменять свой порядок, отчего работавшее в редакторе, МОЖЕТ, перестать работать в игре.
Т.е. не хватайтесь за валидол, а просто проверьте графики сцены.
 
И да!
Большой плюс этого метода (со свойствами трафарета) "приветы" могут быть где угодно.
В т.ч. ЗА другой стеной.
Т.е. им не обязательно стоять рядом с баннером.
Можно хоть в кантоны Вивека напихать статуй, но видно их будет только на полотне стягов.

Либо создать таким методом дырки в стенах...
Разместив "монитор" над поверхностью, а геометрию дыры за ней.
 
И больший и жирный знак вопроса, или минус...
На ATI (AMD) и NV видео картах - это может работать по разному!
Т.е. описанные здесь настройки свойств трафарета, работали на ATI (radeon), но вполне могут не сработать на NVidia.
Т.е. придется подбирать другие настройки для правильной работы свойств трафарета.
Однако, Z-буфер верен для всех случаев.
Т.е. на АТИ и NV требуется установка значения 0 или 2.
Хотя, как кажется, 0 работает лучше.
Значение 2 приводило к проблемам между моделями...
 
Примечание.
Настройки не самые "идеальные", правильнее было бы использовать TEST_EQUAL а не TEST_NOT_EQUAL.
Но в этом случае сработали именно эти.
TEST_NOT_EQUAL позволяет "видеть" объект скрытый таким методом не только через его "экран", но и через любые другие объекты с настройки TEST_NOT_EQUAL.
Т.е. если  в сцене окажется любой другой объект с настройками трафарета в режиме TEST_NOT_EQUAL, они будут взаимодействовать вне зависимости от настроек маски.
НО!
Один из таких объектов должен быть видимым, т.е. в данном случае, "приветы" будут не видимы друг для друга.
Пример "правильных" настроек описан здесь.
 
Примечание.
Можно использовать 4844 флаг альфы, объекты будут отображаться на такой поверхности.
Т.е. для поверхности "монитора".
Но это не даст использовать альфа смешивание, что негативно сказывается на контуре альфа канала текстуры.
Т.е. режимы альфы со смешиванием, блокируют работу свойств трафарета!
Т.е. второй объект перестает отображаться на такой поверхности.
Либо альфа свойства приходится отключать, либо переводить в режим сортировки (флаг No Sorter).
Это позволяет сохранять и смешивание и тестирование.
Однако!
Флаг No Sorter может создавать проблемы с лендскейпом и другим объектами содержащих альфа свойства в экстерьерах.
 
Примечание.
Для создание эффекта некоторой полупрозрачной поверхности поверхности за которой находится второй объект, требуется добавлять еще один шейп!
Без свойств трафарета и с обычной 4845ой альфой. Что и было сделано в этом примере.
Т.к. сами по себе свойства трафарета лишь перерисовывают пиксели, не оказывая влияние на их взаимодействие.
Отчего и требуется ставить дополнительный фильтр, так сказать.
 
Примечание.
Если используется только один слой (с альфой и трафаретом) "фильтр" будет применяться только с одной стороны.
Т.е. поверхность "фильтр" должна быть двусторонняя, при этом "физически".
Если использованы свойства трафарета, только одна сторона будет работать фильтром, зеркальное ее отображение не будет накладывать эффект фильтра на "маскируемый" объект.
 
Т.е. если поверхность изображающая стекло (или ткань) находиться между игроком и объектом, все будет отображаться прекрасно! Объект будет перекрыт "фильтром".
Но если зайти с другой стороны, объект отобразиться уже без фильтра.
Это актуально для случаев, маскируемый объект находится рядом со своей "маской-монитором".
Если же объект находится за стеной и (или) не может быть виден с другой стороны поверхности, достаточно использовать одну поверхность для получения хорошего "фильтра".
 
Примечание.
У "маскируемого" объекта (Привета) можно отключать нормали.
Это сделает его менее объемным.
Т.е. он не будет реагировать на затенение.
См. здесь, раздел Normall.
Чайник за стеклом не реагирует на освещение от лампы.
 
Примечание!
Обращайте внимание, что z-буфера (флаги 1 и 3) взаимодействуют между собой в разных моделях!
Т.е. это может создавать разного рода комбинации, скрывающие, или проявляющие другие объекты.
В первую очередь это касается маскирующих поверхностей "мониторов", на которых отображаются скрываемые объекты.
Однако, как видно на скриншоте выше, второй чайник зацепил своим z-буфером (флаг 2) стоящую рядом дверь.
Отчего на нем видна ее текстура.
Т.е. проверяйте правильность размещения объектов в сцене, при этом только в игре!
И z-буфер можно использовать по разному.
Здесь z-буфер и свойства альфы скрыли все двери в помещении.
Флаг альфы 4844 (255).
А здесь все наоборот.
Двери видно, но все помещение исчезло.
Добавлен z-буфер флаг 1.
 
Примечание.
Объекты можно скрывать через значение Stencil Function = TEST_NEVER.
Это полностью скроет поверхность, кроме случаев когда на ней отображается второй объект.
Метод хорош для случаев, когда экран не должен никак себя проявлять.
Пустое место на которое "вылезет", перед глазами изумленного Неревара, "какая-то надпись"... (С)
Подробный разбор этого метода см. здесь.
 
Примечание.
Также объекты можно скрывать через значения Fail Action Z Fail Action и Pass Action = ACTION_ZERO.
Это также взаимодействует с Stencil Function = ХХХ.
Что было использовано в примере с баннером.
Если значение TEST_ALWAYS то объект будет виден, если указано некоторое условие для отображения, будет скрыт.
Метод подходит для случаев с "видим" экраном у которого есть текстура с альфа каналом.
Т.е. сам экран отображается, но маскируются объекты которые должны быть нарисованы на нем.