Часто бывает нужно получить рендер всей сцены с одним материалом. Например для “глиняных” рендеров (clay render) или рендеров сетки (wireframe render). Если для рендер-движка Cycles в настройках View Layer Properties – Override предусмотрена возможность глобально заменить все материалы на один, то для рендер-движка EEVEE такой возможности нет.
Быстрое переопределение материалов для рендер-движка EEVEE можно сделать с помощью небольшого скрипта, как это показано в следующем видео:
Автор скрипта и видео Виталий Сокол
Для создания системы быстрой замены материала используется следующий скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
import bpy group_name = "GlobalMixer" mixer_name = "Overrider" MixerGlobalGroup = bpy.data.node_groups.get(group_name) # create a group if MixerGlobalGroup == None : test_group = bpy.data.node_groups.new(group_name, 'ShaderNodeTree') # create group inputs group_inputs = test_group.nodes.new('NodeGroupInput') group_inputs.location = (-200,0) test_group.inputs.new('NodeSocketShader','MainShader') # create group outputs group_outputs = test_group.nodes.new('NodeGroupOutput') group_outputs.location = (400,0) test_group.outputs.new('NodeSocketShader','MixedShader') # create three math nodes in a group node = test_group.nodes.new('ShaderNodeMixShader') node.location = (-200,-200) node.inputs[0].default_value = 1 node2 = test_group.nodes.new('ShaderNodeBsdfDiffuse') node.location = (200,100) # link inputs test_group.links.new(group_inputs.outputs['MainShader'], node.inputs[1]) #link output test_group.links.new(node.outputs[0], group_outputs.inputs['MixedShader']) test_group.links.new(node2.outputs[0], node.inputs[2]) MixerGlobalGroup = test_group print('Global MIxer Created:', MixerGlobalGroup) else: test_group = bpy.data.node_groups[group_name] print('Global MIxer Exists: ', test_group) ##################################################################################### # ADD A MIXER GROUP ##################################################################################### for mat in bpy.data.materials: nodes = mat.node_tree.nodes if nodes.get(mixer_name) == None: mixer = nodes.new(type="ShaderNodeGroup") mixer.node_tree = MixerGlobalGroup mixer.name = mixer_name mixer.location = (200,200) print(mixer_name," [created] ", mixer) else: print("....overrider already exists") mylinks = mat.node_tree.links matOut = nodes.get("Material Output") matInput = matOut.inputs mixerOut = nodes.get(mixer_name).outputs mixerIn = nodes.get(mixer_name).inputs old_link = matInput['Surface'].links[0].from_node if old_link.name != mixer_name: print("conected to: ",old_link.name) mylinks.new(mixerOut[0], matInput[0]) old_link = mylinks.new(mixerIn[0], old_link.outputs[0]) else: print("already connected to ", mixer_name) |
При выполнении, этот скрипт создает нодовую группу и вставляет ее в каждый материал перед завершающим нодом “Material Output”.
Материал до выполнения скрипта:
Материал после выполнения скрипта:
Внутри созданной скриптом нодовой группы находятся нод “Diffuse” связанный через нод “Mix” со входом, в который транслируется исходный материал, наложенный на объект. “Diffuse” – это собственно тот шейдер, на который будет заменяться основной материал объекта. Вместо него можно собрать любую комбинацию нод для получения нужного материала замены. Главное – чтобы она размещалась внутри данной нодовой группы.
Для того, чтобы нодовая группа заработала – основной материал заменился на материал, указанный в группе, нужно изменить значение “Factor” нода “Mix Shader” с 0 на 1. Нод “Mix Shader” выступает в качестве переключателя: Factor = 0 – используется материал объекта, Factor = 1 – используется материал группы.
При переключении значения “Factor” в единицу мы увидим, что абсолютно на всех объектах сцены их исходный материал поменялся на материал группы (Diffuse). Это происходит потому, что нодовая группа работает как “инстанс” или “ссылка”, то есть ее содержимое все время остается одинаково, независимо от того, в каком материале эта нодовая группа размещается.
Благодаря тому, что скрипт помещает данную нодовую группу в каждый материал сцены, мы получаем возможность легко заменять все материалы объектов на один материал и обратно, просто меняя значение “Factor” нода “Mix Shader” внутри группы.