miLabel для контроля mib_amb_occlusion
В шейдере mib_amb_occlusion имеются два уродливых, но полезных атрибута: id_inclexcl и id_nonself. Вкупе с кастомным атрибутом miLabel они позволяют определять какие именно объекты могут затенять, а какие нет, а так же определять затеняет ли объект сам себя. Ключевой для понимания момент – речь идет только о способности затенять, а не о способности принимать затенение.
Работает все следующим образом – назначаем трансформ нодам объектов integer атрибут miLabel с нужным значением (по сути, это группировка объектов по id):
и используем это значение в шейдере mib_amb_occlusion:
Остается только разобраться как использовать эти значения 🙂
id_inclexcl при дефолтовом значении 0 говорит шейдеру, что все объекты, на которые он назначен, затеняют друг друга. Положительные значения говорят шейдеру, что затенять могут только объекты с соответствующим miLabel, отрицательные – все объекты, кроме тех, что с соответствующим miLabel.
id_nonself при отрицательном значении или 0 указывает всем объектам затенять самих себя, при положительных – объекты с соответствующим miLabel не будут затенять себя (и друг друга). Разумеется, если согласно атрибуту id_inclexcl объект уже не затеняет ничего, то и себя он затенять не будет вне зависимости от значения id_nonself (хотя разница все же имеется – при отключении самозатенения, области объекта, затененные другими областями того же объекта, заливаются bright color… а при наличии самозатенения продолжают затеняться другими объектами в сцене, так что все-таки некоторое влияние на прием затенений все же присутствует 🙂 )
На изображении выше цветкам назначены miLabel 1, 2, 3 соответственно, на плейн под ними – 4. В шейдере mib_amb_occlusion (висит через surfaceShader на всех четырех объектах) установлены значения:
id_inclexcl = -3 (объекты с miLabel равным 3 не затеняют ничего)
id_nonself = 2 (объекты с miLabel равным 2 не затеняют сами себя)
Как результат:
- левый цветок кидает тень на землю и затеняет сам себя, так как miLabel его равен 1;
- средний цветок с miLabel в значении 2 затеняет землю, но не затеняет сам себя;
- правый с miLabel = 3 не затеняет землю и не затеняет себя;
- земля с miLabel = 4 влияет на все цветки (стоит отметить разницу во влиянии на средний и правый цветки – при неотключенном самозатенении эффект проникает сквозь лепестки).
Другой пример:
- левый и правый цветки и земля не затеняют ни себя, ни друг друга (поэтому почти не видны на изображении);
- сердний цветок затеняет остальных, но не затеняет самого себя в соответствии с id_nonself.
Если все цветки объединить под один miLabel, получим вот такой результат:
Цветки затеняют землю, но земля на них не влияет. Наверху – с самозатенением, внизу – без.
И еще один вариант – только влияние земли на цветы:
Без отключения самозатенения (наверху) земля некорректно затеняет цветы сквозь лепестки.
На практике эти возможности управления окклюженом полезны при создании специфических пассов (для тюнинга раздельно в композе), для отключения самооклюжена заменителей съемочных объектов, от которых нужно бросить окклюжен на объекты сцены… и для бэйка. К примеру, имея подобную сцену:
хотим получить только окклюжен на лице от паука – без самозатенений на глазницах. Добавляем голове miLabel со значением, вводим его в id_nonself, а пауку отключаем primary visibility:
In: Render · Tagged with: id_inclexcl, id_nonself, maya, mentalray, mib_amb_occlusion, miLabel, occlusion, shading, shadow
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
on 17 April 2011 at 12:59
Permalink
Here it is:
http://www.sigillarium.com/blog/wp-content/uploads/2009/06/06_occl_01.rar