miLabel для контроля mib_amb_occlusion

В шейдере mib_amb_occlusion имеются два уродливых, но полезных атрибута: id_inclexcl и id_nonself. Вкупе с кастомным атрибутом miLabel они позволяют определять какие именно объекты могут затенять, а какие нет, а так же определять затеняет ли объект сам себя. Ключевой для понимания момент – речь идет только о способности затенять, а не о способности принимать затенение.

Disabling self-occlusion with miLabel attribute

Disabling self-occlusion with miLabel attribute

Работает все следующим образом – назначаем трансформ нодам объектов integer атрибут miLabel с нужным значением (по сути, это группировка объектов по id):

Adding miLabel attribute

Adding miLabel attribute

и используем это значение в шейдере mib_amb_occlusion:

id_inclexcl and id_nonself attributes of mib_amb_occlusion

id_inclexcl and id_nonself attributes of mib_amb_occlusion

Остается только разобраться как использовать эти значения :)

id_inclexcl при дефолтовом значении 0 говорит шейдеру, что все объекты, на которые он назначен, затеняют друг друга. Положительные значения говорят шейдеру, что затенять могут только объекты с соответствующим miLabel, отрицательные – все объекты, кроме тех, что с соответствующим miLabel.

id_nonself при отрицательном значении или 0 указывает всем объектам затенять самих себя, при положительных – объекты с соответствующим miLabel не будут затенять себя (и друг друга). Разумеется, если согласно атрибуту id_inclexcl объект уже не затеняет ничего, то и себя он затенять не будет вне зависимости от значения id_nonself (хотя разница все же имеется – при отключении самозатенения, области объекта, затененные другими областями того же объекта, заливаются bright color… а при наличии самозатенения продолжают затеняться другими объектами в сцене, так что все-таки некоторое влияние на прием затенений все же присутствует :) )

Different occlusion relationships

Different occlusion relationships

На изображении выше цветкам назначены miLabel 1, 2, 3 соответственно, на плейн под ними – 4. В шейдере mib_amb_occlusion (висит через surfaceShader на всех четырех объектах) установлены значения:

id_inclexcl = -3 (объекты с miLabel равным 3 не затеняют ничего)

id_nonself = 2 (объекты с miLabel равным 2 не затеняют сами себя)

Как результат:

Другой пример:

Different occlusion relationships

Different occlusion relationships

Если все цветки объединить под один miLabel, получим вот такой результат:

Flowers affect ground only and vice versa

Flowers affect ground with and without self-occlusion

Цветки затеняют землю, но земля на них не влияет. Наверху – с самозатенением, внизу – без.

И еще один вариант – только влияние земли на цветы:

Ground affects flowers with and without self-occlusion

Ground affects flowers with and without self-occlusion

Без отключения самозатенения (наверху) земля некорректно затеняет цветы сквозь лепестки.

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

Default occlusion behavior

Default occlusion behavior

хотим получить только окклюжен на лице от паука – без самозатенений на глазницах. Добавляем голове miLabel со значением, вводим его в id_nonself, а пауку отключаем primary visibility:

No self-occlusion for the head and spider is hidden

No self-occlusion for the head and spider is hidden

2 Responses to “miLabel для контроля mib_amb_occlusion”

  1. asin - April 17, 2011

    hi, nice tips here, buti still confuse about this miLabel things.. can you attach file for the flowers?

    regard

  2. Sagroth - April 17, 2011

    Here it is:
    http://www.sigillarium.com/blog/wp-content/uploads/2009/06/06_occl_01.rar

Leave a Reply