Я немного новичок в Maya Python, но я постараюсь объяснить свой вопрос как можно подробнее.
Я создал сценарий для Maya, в котором пользователь может назначить шейдер (aiStandardSurface и т. д.) выбранному им объекту, как только пользователь нажимает кнопку, создается шейдер со всеми подключенными узлами, которые ему нужны (например, файловые узлы подключены напрямую). Теперь то, что я хочу сделать, это иметь возможность подключать карты текстур из текстур в папке исходных изображений и импортировать их вместе с узлами, это в основном скрипт Auto Shader. Но я борюсь с тем, с чего начать и как я могу действовать правильно. Если у вас есть какие-либо ресурсы, это было бы потрясающе! Вот мой код в первую очередь.
from functools import partial
from maya import cmds
import os
#### FUNCTION ####
def get_texture_path():
""" Open a file dialog to query a directory path
Returns:
str or None
"""
directory_path = cmds.fileDialog2(fm=2, okc="Set")
return directory_path
class UI:
def __init__(self):
self.main_window = cmds.window(title="UI", widthHeight=(200, 150), sizeable=True)
self.build_ui()
def build_ui(self):
cmds.columnLayout(adjustableColumn=True, rowSpacing=5)
cmds.text(label="Shader Template", font="boldLabelFont", height=25)
cmds.setParent('..')
cmds.setParent('..')
cmds.columnLayout(adjustableColumn=True, rowSpacing=5)
cmds.text(label="Select your mesh or group first,", align="center")
cmds.text(label="then click on your desired renderer", align="center")
cmds.setParent('..')
mainLayout = cmds.columnLayout(w=500, h=35)
cmds.separator()
self.tf_shader_newname = cmds.textFieldGrp(label="Shader Name:", editable=True, parent=mainLayout)
cmds.setParent('..')
cmds.setParent('..')
cmds.columnLayout(columnAttach=('both', 5), rowSpacing=10, adjustableColumn=True)
cmds.button(label="Arnold", c=partial(self.shader_assign, "arnold"))
cmds.button(label="Renderman", c=partial(self.shader_assign, "renderman"))
def shader_assign(self, render_engine, texture_dir):
selection_list = cmds.ls(sl=True)
shader_name = cmds.textFieldGrp(self.tf_shader_newname, q=True, text=True)
texture_directory = get_texture_path()
if not texture_directory:
print("User aborted the assign operation")
return
if render_engine == "arnold":
arnold_create_network(shaderName=shader_name, selection_list=selection_list, texture_dir=texture_directory)
elif render_engine == "renderman":
rendermanAssign(shaderName=shader_name, selection_list=selection_list, texture_dir=texture_directory)
else:
raise RuntimeError("render engine not supported")
def show_window(self):
cmds.showWindow(self.main_window)
return
# ### RENDERMAN ###
def rendermanAssign(shaderName, selection_list, texture_dir):
# creer un shader
myShader = cmds.shadingNode('PxrSurface', asShader=True, name=shaderName + "_Mtl")
# creer un shading group
myShaderSG = cmds.sets(renderable=True, noSurfaceShader=True, empty=True, name=myShader + "SG")
# shader to shading group
cmds.connectAttr('%s.outColor' % myShader, '%s.surfaceShader' % myShaderSG)
# connect the nodes
"""ALBEDO NODES"""
remap = cmds.shadingNode('PxrRemap', name='remap_albedo_' + shaderName, asTexture=True)
hsl = cmds.shadingNode('PxrHSL', name='HSL_albedo_' + shaderName, asTexture=True)
cc = cmds.shadingNode('PxrColorCorrect', name='color_correct_albedo_' + shaderName, asTexture=True)
pxrtexture = cmds.shadingNode('PxrTexture', name='albedo_' + shaderName, asTexture=True)
"""SPECULAR NODES"""
remap_spec = cmds.shadingNode('PxrRemap', name='remap_specular_' + shaderName, asTexture=True)
hsl_spec = cmds.shadingNode('PxrHSL', name='HSL_specular_' + shaderName, asTexture=True)
cc_spec = cmds.shadingNode('PxrColorCorrect', name='color_correct_specular_' + shaderName, asTexture=True)
pxrtexture_spec = cmds.shadingNode('PxrTexture', name='specular_' + shaderName, asTexture=True)
"""ROUGHNESS NODES"""
remap_roughness = cmds.shadingNode('PxrRemap', name='remap_roughess_' + shaderName, asTexture=True)
hsl_roughness = cmds.shadingNode('PxrHSL', name='HSL_roughness_' + shaderName, asTexture=True)
cc_roughness = cmds.shadingNode('PxrColorCorrect', name='color_correct_roughness_' + shaderName, asTexture=True)
pxrtexture_roughness = cmds.shadingNode('PxrTexture', name='roughness_' + shaderName, asTexture=True)
"""BUMP AND NORMAL MAP NODES"""
remap_bump_normal = cmds.shadingNode('PxrRemap', name='remap_bump_normal_' + shaderName, asTexture=True)
pxrtexture_bump = cmds.shadingNode('PxrTexture', name='bump_normal_' + shaderName, asTexture=True)
bump = cmds.shadingNode('PxrBump', name='bump_' + shaderName, asTexture=True)
"""DISPLACEMENT NODES"""
displace = cmds.shadingNode('PxrDisplace', name='disp_' + shaderName, asShader=True)
dispTransform = cmds.shadingNode('PxrDispTransform', name='dispTransform_' + shaderName, asTexture=True)
pxrtexture_disp = cmds.shadingNode('PxrTexture', name='displacement_' + shaderName, asTexture=True)
"""ALBEDO"""
cmds.connectAttr('%s.resultRGB' % remap, '%s.diffuseColor' % myShader)
cmds.connectAttr('%s.resultRGB' % hsl, '%s.inputRGB' % remap)
cmds.connectAttr('%s.resultRGB' % cc, '%s.inputRGB' % hsl)
cmds.connectAttr('%s.resultRGB' % pxrtexture, '%s.inputRGB' % cc)
"""SPECULAR"""
cmds.connectAttr('%s.resultRGB' % remap_spec, '%s.specularFaceColor' % myShader)
cmds.connectAttr('%s.resultRGB' % hsl_spec, '%s.inputRGB' % remap_spec)
cmds.connectAttr('%s.resultRGB' % cc_spec, '%s.inputRGB' % hsl_spec)
cmds.connectAttr('%s.resultRGB' % pxrtexture_spec, '%s.inputRGB' % cc_spec)
"""ROUGHNESS"""
cmds.connectAttr('%s.resultR' % remap_roughness, '%s.specularRoughness' % myShader)
cmds.connectAttr('%s.resultRGB' % hsl_roughness, '%s.inputRGB' % remap_roughness)
cmds.connectAttr('%s.resultRGB' % cc_roughness, '%s.inputRGB' % hsl_roughness)
cmds.connectAttr('%s.resultRGB' % pxrtexture_roughness, '%s.inputRGB' % cc_roughness)
"""BUMP NORMAL"""
cmds.connectAttr('%s.resultRGB' % pxrtexture_bump, '%s.inputRGB' % remap_bump_normal)
cmds.connectAttr('%s.resultR' % remap_bump_normal, '%s.inputBump' % bump)
cmds.connectAttr('%s.resultN' % bump, '%s.bumpNormal' % myShader)
"""DISPLACEMENT"""
cmds.connectAttr('%s.resultR' % pxrtexture_disp, '%s.dispScalar' % dispTransform)
cmds.connectAttr('%s.resultF' % dispTransform, '%s.dispScalar' % displace)
cmds.connectAttr('%s.outColor' % displace, '%s.displacementShader' % myShaderSG)
# PxrTexture attributes
cmds.setAttr(pxrtexture + ".atlasStyle", 1)
cmds.setAttr(pxrtexture + ".linearize", 1)
# Specular attributes
cmds.setAttr(pxrtexture_spec + ".atlasStyle", 1)
# Roughness attributes
cmds.setAttr(pxrtexture_roughness + ".atlasStyle", 1)
# Bump and normal attributes
cmds.setAttr(pxrtexture_bump + ".atlasStyle", 1)
# Displacement attributes
cmds.setAttr(pxrtexture_disp + ".atlasStyle", 1)
cmds.setAttr(dispTransform + ".dispRemapMode", 2)
# assign le shader a la selection
for o in mySelectionList:
cmds.sets(o, e=True, forceElement=myShaderSG)
print('Renderman Shader assigned to object successfully')
def arnold_create_network(shaderName, selection_list, texture_dir):
# create shader
aiSts_node = cmds.shadingNode('aiStandardSurface', asShader=True, name=shaderName + "_Mtl")
# create a shading group
myShaderSG = cmds.sets(renderable=True, noSurfaceShader=True, empty=True, name=aiSts_node + "SG")
# assign shader to shading group
cmds.connectAttr('%s.outColor' % aiSts_node, '%s.surfaceShader' % myShaderSG)
# assign shader to selection
for o in selection_list:
cmds.sets(o, e=True, forceElement=myShaderSG)
# connect nodes ALBEDO
myFile_Albedo = cmds.shadingNode("file", asTexture=True, name='albedo_' + aiSts_node)
place2dtexture = cmds.shadingNode("place2dTexture", asTexture=True, name='Tile_Albedo_' + aiSts_node)
rangeAlbedo = cmds.shadingNode("aiRange", asTexture=True, name='Range_Albedo_' + aiSts_node)
colorCorrectAlbedo = cmds.shadingNode("aiColorCorrect", asTexture=True, name='ColorCorrect_Albedo_' + aiSts_node)
# connect place2d texture to file node
cmds.defaultNavigation(connectToExisting=True, source=place2dtexture, destination=myFile_Albedo)
cmds.connectAttr(myFile_Albedo + ".outColor", colorCorrectAlbedo + ".input", force=True)
cmds.connectAttr(colorCorrectAlbedo + ".outColor", rangeAlbedo + ".input", force=True)
cmds.connectAttr(rangeAlbedo + ".outColor", aiSts_node + ".baseColor", force=True)
# attributes
cmds.setAttr(myFile_Albedo + ".uvTilingMode", 3)
cmds.setAttr(myFile_Albedo + ".colorSpace", "sRGB", type='string')
# connect nodes METALNESS
myFile_Metalness = cmds.shadingNode("file", asTexture=True, name='metalness_' + aiSts_node)
place2dtexture = cmds.shadingNode("place2dTexture", asTexture=True, name='Tile_Metalness_' + aiSts_node)
rangeMetalness = cmds.shadingNode("aiRange", asTexture=True, name='Range_Metalness_' + aiSts_node)
colorCorrectMetalness = cmds.shadingNode("aiColorCorrect", asTexture=True,
name='ColorCorrect_Metalness_' + aiSts_node)
# connect place2d texture to file node
cmds.defaultNavigation(connectToExisting=True, source=place2dtexture, destination=myFile_Metalness)
cmds.connectAttr(myFile_Metalness + ".outColor", colorCorrectMetalness + ".input", force=True)
cmds.connectAttr(colorCorrectMetalness + ".outColor", rangeMetalness + ".input", force=True)
cmds.connectAttr(rangeMetalness + ".outColorR", aiSts_node + ".metalness", force=True)
# attributes
cmds.setAttr(myFile_Metalness + ".uvTilingMode", 3)
cmds.setAttr(myFile_Metalness + ".colorSpace", "Raw", type='string')
# connect nodes SPECULAR
myFile_SpecularWeight = cmds.shadingNode("file", asTexture=True, name='specular_' + aiSts_node)
place2dtexture = cmds.shadingNode("place2dTexture", asTexture=True, name='Tile_Specular_' + aiSts_node)
rangeSpecular = cmds.shadingNode("aiRange", asTexture=True, name='Range_Specular_' + aiSts_node)
colorCorrectSpecular = cmds.shadingNode("aiColorCorrect", asTexture=True,
name='ColorCorrect_Specular_' + aiSts_node)
# connect place2d texture to file node
cmds.defaultNavigation(connectToExisting=True, source=place2dtexture, destination=myFile_SpecularWeight)
cmds.connectAttr(myFile_SpecularWeight + ".outColor", colorCorrectSpecular + ".input", force=True)
cmds.connectAttr(colorCorrectSpecular + ".outColor", rangeSpecular + ".input", force=True)
cmds.connectAttr(rangeSpecular + ".outColorR", aiSts_node + ".specular", force=True)
# attributes
cmds.setAttr(myFile_SpecularWeight + ".uvTilingMode", 3)
cmds.setAttr(myFile_SpecularWeight + ".colorSpace", "Raw", type='string')
# connect nodes ROUGHNESS
myFile_Roughness = cmds.shadingNode("file", asTexture=True, name='roughness_' + aiSts_node)
place2dtexture = cmds.shadingNode("place2dTexture", asTexture=True, name='Tile_Roughness_' + aiSts_node)
rangeRoughness = cmds.shadingNode("aiRange", asTexture=True, name='Range_Roughness_' + aiSts_node)
colorCorrectRoughness = cmds.shadingNode("aiColorCorrect", asTexture=True,
name='ColorCorrect_Roughness_' + aiSts_node)
# connect place2d texture to file node
cmds.defaultNavigation(connectToExisting=True, source=place2dtexture, destination=myFile_Roughness)
cmds.connectAttr(myFile_Roughness + ".outColor", colorCorrectRoughness + ".input", force=True)
cmds.connectAttr(colorCorrectRoughness + ".outColor", rangeRoughness + ".input", force=True)
cmds.connectAttr(rangeRoughness + ".outColorR", aiSts_node + ".specularRoughness", force=True)
# attributes
cmds.setAttr(myFile_Roughness + ".uvTilingMode", 3)
cmds.setAttr(myFile_Roughness + ".colorSpace", "Raw", type='string')
# connect nodes BUMP
myFile_Bump = cmds.shadingNode("file", asTexture=True, name='bump_' + aiSts_node)
place2dtexture = cmds.shadingNode("place2dTexture", asTexture=True, name='Tile_Bump_' + aiSts_node)
rangeBump = cmds.shadingNode("aiRange", asTexture=True, name='Range_Bump_' + aiSts_node)
colorCorrectBump = cmds.shadingNode("aiColorCorrect", asTexture=True, name='ColorCorrect_Bump_' + aiSts_node)
bump = cmds.shadingNode("aiBump2d", asShader=True, name='BumpSettings_' + aiSts_node)
""" Mette le defaultNavigation""" # TODO
# attributes
cmds.setAttr(myFile_Bump + ".uvTilingMode", 3)
cmds.setAttr(myFile_Bump + ".colorSpace", "Raw", type='string')
# connect nodes DISPLACEMENT
myFile_Displacement = cmds.shadingNode("file", asTexture=True, name='displacement_' + aiSts_node)
place2dtexture = cmds.shadingNode("place2dTexture", asTexture=True, name='Tile_Displacement_' + aiSts_node)
rangeDisp = cmds.shadingNode("aiRange", asTexture=True, name='Range_Displacement_' + aiSts_node)
colorCorrectDisp = cmds.shadingNode("aiColorCorrect", asTexture=True,
name='ColorCorrect_Displacement_' + aiSts_node)
displace = cmds.shadingNode("displacementShader", asShader=True, name='DisplacementSettings_' + aiSts_node)
""" Mette le defaultNavigation""" # TODO
cmds.connectAttr(myFile_Displacement + ".outColor", colorCorrectDisp + ".input", force=True)
cmds.connectAttr(colorCorrectDisp + ".outColor", rangeDisp + ".input", force=True)
cmds.connectAttr(rangeDisp + ".outColorR", displace + ".displacement", force=True)
cmds.connectAttr(displace + ".displacement", myShaderSG + ".displacementShader", force=True)
# attributes
cmds.setAttr(myFile_Displacement + ".uvTilingMode", 3)
cmds.setAttr(myFile_Displacement + ".colorSpace", "Raw", type='string')
print('Arnold Shader assigned to object successfully')
if __name__ == '__main__':
ui = UI()
ui.show_window()
print('Happy Texturing!')