miLabel для контроля mib_amb_occlusion|miLabel to control mib_amb_occlusion

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

There’re two ugly but useful attributes in mib_amb_occlusionid_inclexcl and id_nonself. Along with custom miLabel attribute they can define which objects can occlude, which ones can’t and whether objects self-occlude or not. Key thing to understand here – it is question of just an ability to occlude, not of ability to receive occlusion.

Disabling self-occlusion with miLabel attribute

Disabling self-occlusion with miLabel attribute

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

It works this way – add integer attribute miLabel to transforms nodes of objects, assign specific values (that’s actually objects grouping by id):

Adding miLabel attribute

Adding miLabel attribute

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

and use these values for mib_amb_occlusion:

id_inclexcl and id_nonself attributes of mib_amb_occlusion

id_inclexcl and id_nonself attributes of mib_amb_occlusion

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

The only thing left is to understand how to operate these values 🙂

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

id_inclexcl with default value of 0 tells shader that all objects it’s assigned to can occlude each other. Positive values tell shader that only objects with corresponding miLabel value can occlude, and negative values – that all objects can occlude, except those with corresponding miLabel.

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

id_nonself with negative or default 0 values tells shader that all objects can occlude themselves, with positive ones – that objects with corresponding miLabel can’t occlude themselves (and each other). Of course, if according to id_inclexcl attribute an object doesn’t occlude, it won’t self-occlude also no matter what id_nonself is set to (actually, there’s a difference – if self-occlusion is disabled, regions of the object that are occluded by other regions of the same object, get filled with bright color… but if self-occlusion is enabled they continue to receive occlusion from other objects of the scene… so, in a way there’re some relations to receiving occlusion after all 🙂 )

Different occlusion relationships

Different occlusion relationships

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

Image above shows flowers with miLabel values 1, 2, 3 accordingly, plane beneath them – 4. mib_amb_occlusion (assigned to all these objects through surfaceShader) has following values:

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

id_inclexcl = -3 (objects with miLabel equal to 3 don’t occlude a thing)

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

id_nonself = 2 (objects with miLabel equal to 2 don’t self-occlude)

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

As a result:

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

Another example:

Different occlusion relationships

Different occlusion relationships

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

If we join all flowers together under the same miLabel, we’ll get this:

Flowers affect ground only and vice versa

Flowers affect ground with and without self-occlusion

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

Flowers occlude ground, but ground doesn’t affect them. Upper part – with self-occlusion, lower – without.

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

And yet another version – just ground affects flowers:

Ground affects flowers with and without self-occlusion

Ground affects flowers with and without self-occlusion

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

With self-occlusion left enabled (upper) ground incorrectly occludes flowers through petals.

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

In practice these abilities to control occlusion are useful for creating specific passes (for separate tuning in compositing), for disabling self-occlusion of live objects’ stand-ins, from which you need to get occlusion on the objects of the scene… and for baking. For example, having a scene like that:

Default occlusion behavior

Default occlusion behavior

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

we want to get only occlusion from spider on the face – without self-occlusion on eye sockets. Add miLabel for the head with a value, type this value into id_nonself and turn off primary visibility for the spider:

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 2011.04.17 at 07: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