Автоматическое назначение шейдера с текстурными картами

Я немного новичок в 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!')

пользовательский интерфейс


person William Fiorentini    schedule 10.01.2021    source источник
comment
Не знаю, какие у вас проблемы. Во-первых, вам нужен способ определить каталог исходных изображений, возможно, кнопка в вашем пользовательском интерфейсе, которая вызывает функцию get_texture_path(). И тогда вы можете прочитать каталог и проанализировать файлы.   -  person haggi krey    schedule 12.01.2021


Ответы (1)


import maya.cmds as cmds

tex_file = "c:/tex/map.png"

fileNode = cmds.shadingNode("file", asTexture=True, isColorManaged=True)

cmds.setAttr("{}.fileTextureName".format(fileNode), tex_file, type="string")

введите здесь описание изображения

cmds.setAttr(file1.fileTextureName, c:/tex/map.png)

person g2m.agent    schedule 14.01.2021
comment
Пожалуйста, рассмотрите возможность добавления дополнительного контекста/информации, почему ваш код может быть полезен для OP (поскольку проблема на самом деле не ясна). - person geertjanvdk; 14.01.2021
comment
Я думаю, Уильям просто хочет заполнить путь изображения к узлу файла Maya. - person g2m.agent; 15.01.2021