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

Posted on June 6, 2009 at 23:24 by · Permalink
In: Render · Tagged with: , , , , , , , ,

2 Responses

Subscribe to comments via RSS

  1. Written by asin
    on 17 April 2011 at 7:27
    Permalink

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

    regard

Subscribe to comments via RSS

Leave a Reply