【问题标题】:Auto Assign Shader with Texture maps使用纹理贴图自动分配着色器
【发布时间】:2021-04-15 17:30:40
【问题描述】:

我对 Maya Python 有点陌生,但我会尽可能详细地解释我的问题。

我为 Maya 创建了一个脚本,用户可以在其中将着色器(aiStandardSurface 等)分配给他选择的对象,一旦用户单击按钮,就会创建一个着色器,其中连接了他需要的所有节点(例如:文件节点直接连接)。现在我想做的是能够从 sourceimages 文件夹中的纹理中插入纹理贴图并将它们与节点一起导入,它基本上是一个 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!')

UI

【问题讨论】:

  • 不确定您有什么问题。首先,您需要一种方法来定义 sourceimages 目录,可能是 UI 中调用 get_texture_path() 函数的按钮。然后你就可以读取目录并分析文件了。

标签: python shader textures maya assign


【解决方案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")

【讨论】:

  • 请考虑添加更多上下文/信息,为什么您的代码可能对 OP 有用(因为问题实际上并不清楚)。
  • 我认为威廉只是想将图像路径填充到 Maya 文件节点。
猜你喜欢
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
相关资源
最近更新 更多