User Guide Cancel

Substance creation | Substance 3D Automation ToolKit

  1. Substance 3D home
  2. Home
  3. Command Line Tools
    1. Command Line overview
    2. sbsbaker
      1. sbsbaker overview
      2. sbsbaker command line options
      3. sbsbaker Example Command Lines
    3. sbscooker
      1. sbscooker overview
      2. sbscooker command line options
      3. sbscooker pattern variables
    4. sbsmtools
      1. sbsmtools overview
      2. sbsmtools command line options
    5. sbsmutator
      1. sbsmutator overview
      2. sbsmutator command line options
      3. sbsmutator Example Command Lines
    6. sbsrender
      1. sbsrender overview
      2. sbsrender base parameters and pattern variables
      3. sbsrender command line options
      4. sbsrender example command lines
    7. sbsupdater
      1. sbsupdater overview
      2. sbsupdater command line options
  4. Pysbs - Python API
    1. Pysbs - Python API overview
    2. Getting started
    3. General topics
      1. Basic manipulation
      2. Substance creation
      3. Substances modification
      4. Dependencies management
      5. PySbs batchtools module
      6. metadata manipulation
      7. SAT demos
      8. Edit sbsar with SBSARManager
      9. Spot Colors
      10. Thumbnail creation with SAT
    4. Examples
      1. demohelloworld
      2. demos
      3. demos_batchtools
      4. script_update_with_sbsupdater
    5. API Content
      1. API Content overview
      2. Substance definitions
        1. Common interfaces
          1. basegraph
          2. package
          3. sbsarobject
          4. sbsobject
        2. compnode
          1. compnode overview
          2. common
          3. compimplementation
          4. paramgraph
        3. context projectmgr
        4. graph
          1. graph overview
          2. function
          3. inputparameters
          4. output
        5. mdl
          1. mdlannotation
          2. mdlcommon
          3. mdldictionaries
          4. mdlenum
          5. mdlgraph
          6. mdllibclasses
          7. mdlmanager
          8. mdlnode
          9. mdlnodeimpl
          10. mdloperand
          11. mdlsbsbridge
        6. modelgraphindex
          1. modelannotationnames
          2. modelgraph
          3. modelgraphgenerator
          4. modelgraphimplementation
          5. modelnodenames
          6. modeloperand
          7. modulegraphindex
          8. moduleannotation
          9. moduleconnection
          10. modulegraph
          11. modulegraphgenerator
          12. modulegraphimplementation
          13. modulegraphlibrary
          14. modulegraphregister
          15. modulenode
          16. modulenodeimplementation
          17. modulenodeinstance
          18. moduleoperand
          19. moduleoutputbridging
          20. moduleparaminput
        7. params
          1. params overview
          2. dynamicvalue
          3. paramnode
        8. projectmgrdoc
        9. sbsarchive
          1. sbsarchive overview
          2. sbsarenum
          3. sbsargraph
          4. sbsargui
          5. sbsarguiwidgets
          6. sbsarmanager
        10. sbscommon
          1. connections
          2. gui
          3. nodes
          4. values
        11. sbspreset
        12. sbsproject
        13. substance
          1. substance overview
          2. content
          3. resource
      3. Libraries
        1. sbsenum
        2. sbslibrary
          1. sbslibrary overview
          2. sbsdictionaries
          3. sbsfilters
          4. sbsfunctions
          5. sbsfxmapnodes
          6. sbslibclasses
          7. sbswidgets
        3. sbsbakerslibrary
          1. sbsbakerslibrary overview
          2. sbsbakersdef
          3. sbsbakersdefaultprops
          4. sbsbakersdictionaries
          5. sbsbakersenum
          6. sbsbakingconverter
          7. sbsbakingconverterparam
          8. sbsbakingparameters
          9. sbsdialogstate
          10. sbsscenedata
        4. Helpers
          1. sbscleaner
          2. sbsexporter
          3. sbsgenerator
          4. sbsparser
          5. sbswriter
          6. qtclasses
            1. qtclasses overview
            2. qtvariantreader
            3. qtvariantwriter
          7. psdparser
          8. sbsimpactmanager
          9. batchtools
          10. autograph
            1. ag_functions
            2. ag_layout
            3. ag_types
          11. info_mesh_parser
          12. sbsbaker_info_handlers
          13. sbsrender_render_handlers
          14. output_handlers
          15. spotcolorinfo_handler
          16. thumbnail
          17. batchtools overview
        5. Execution context
          1. context
          2. functions
        6. API Change log
  5. Samples
    1. Samples overview
    2. Texturing Template Demo
    3. Batch Tools Demo
    4. Variations
    5. Texture Mat
    6. Pixel Processor Ray tracer
  6. Setup and Getting Started
    1. Setup and Getting Started overview
    2. Compatibility
    3. Frequently asked Questions
    4. Known issues
    5. SAT Cookbook
    6. Use Pysbs in different python interpreter (maya, sd, blender...)
  7. Integrations
    1. Substance Maya toolset
      1. Substance Maya Toolset overview
      2. Installing
      3. Launching
      4. Baking
        1. Baking overview
        2. Export parameters
        3. Baker parameters
        4. Mesh setup
        5. Using a template
      5. Changelog
  8. Changelog overview

Substance creation

This API allows starting from scratch to create a new .sbs file, including the creation of compositing graphs with basic filters, instance of graphs, reference to bitmaps, pixel processor and the definition of the inputs and outputs.

The input parameters of the graph can also be defined.

The node parameters can be tweaked, and they can be set as dynamic, by creating the function that handles the parameter value.

Function graphs can also be created, and can be referenced in another function or dynamic parameter or Pixel processor function.

Sample 1: Hello World

The sample function demohelloworld.demoHelloWorld() is a good starting point to visualize how to use the API in order to create substances.

It demonstrates the creation of a very simple substance, which defines a material with BaseColor, Roughness and Metallic as three Uniform colors.

Launch the script with this command line, from the folder demos/:

python demoHelloWorld.py

And check the result by opening the generated file sample/resultDemoHelloWorld.sbs:

Sample 2: Full creation demonstration

The sample function demos.demoCreation() is a complete demonstration of what this API allows to create.

Launch the script with this command line, from the folder demos/:

python demos.py -fct: demoCreation -args: "../sample/argsDemoCreation.xml"

And check the result by opening the generated file sample/resultDemoCreation.sbs:

Here is the detail of the objects created by this script:

  • A package (e.g a new substance document: SBSDocument)

  • A first graph (SBSGraph), which will be used in the second one, with:
    • The definition of its exposed parameters and the widget associated to them.
    • An input node.
    • Two simple Filters with their parameters (one is dynamic and set as the value of one of the graph input parameters).
    • An output node, with the definition of its usages.
    • The connections for all these nodes.

  • A function (SBSFunction), with:
    • The definition of its input parameters.
    • Some function nodes provided by Substance Designer library.
    • A instance of a function (Pi) included in the default package (sbs://).
    • The definition of the connections, and the output node of the function.

  • A second graph (SBSGraph), with:
    • An input parameter.
    • A FxMap node, with the definition of the FxMap graph and some dynamic parameters.
    • A gradient filter with the definition of the key values.
    • An instance of the first graph created before, and drive one of its parameter by a function: The function retrieves the value of the graph input parameter and pass as the input value of an instance of the function created above.
    • An instance of the substance Blur HQ provided in the default substance package.
    • A svg node, which references an external resource included in the folder sample/.
    • An output node.

Sample 3: MDL Graph creation

The sample function demos.demoCreationMDL() shows specifically the creation of a MDL Graph using the API.

Launch the script with this command line, from the folder demos/:

python demos.py -fct: demoCreationMDL -args: "sample/argsDemoCreationMDL.xml"

And check the result by opening the generated file sample/resultDemoCreationMDL.sbs:

This script creates a new MDL Graph from scratch, mostly identical to a metallic material but with an emissive part:
  • It declares some constants as input parameters of the graph.
  • It instantiates some native mdl nodes, such as ‘material_emission’ and ‘material_surface’.
  • It creates a new light profile resource and uses it to handle the emissive term of the material.

All the objects, libraries and functions related to MDL are included in the module mdl.

Highlights on the most important modules and classes of the API

The objects are created from the parent object that contains them, so the majority of creation methods are located in the following classes:

  • SBSDocument: creation of groups (e.g. folders), graphs and functions.
  • SBSGraph: creation of compositing nodes and definition of input parameters.
  • SBSFunction: creation of function nodes and definition of input parameters.
  • SBSDynamicValue: creation of function nodes and definition of input parameters.
  • SBSParamsGraph: creation of FxMap nodes.

The module sbslibrary contains the definition of all the content available in Substance Designer:

  • a library of Filters, their definition (inputs, outputs, parameters) being defined in module sbslibrary.sbsfilters.
  • a library of Functions, their definition (inputs, outputs, parameters) being defined in module sbslibrary.sbsfunctions.
  • a library of FxMap, their definition (inputs, outputs, parameters) being defined in module sbslibrary.sbsfxmapnodes.

The module sbslibrary.sbsdictionaries contains the dictionaries allowing the mapping between enumeration values (defined in the module sbsenum) and the associated string.e sbsenum.

This example shows the different creation capabilities:

from pysbs import context, sbsenum, sbsgenerator 
 
# Init the context 
myContext = context.Context() 
 
# Substance Creation 
#################### 
 
# Create a new Substance with a graph called 'DemoGraph' 
sbsDoc = sbsgenerator.createSBSDocument(aContext = myContext, 
                    aFileAbsPath = 'my/New/Package/Absolute/Path.sbs', 
                    aGraphIdentifier = 'DemoGraph') 
 
# Create another graph in this Substance, with some parameters 
secondGraph = sbsDoc.createGraph(aGraphIdentifier = 'SecondGraph', 
                    aParameters = {sbsenum.CompNodeParamEnum.OUTPUT_FORMAT:sbsenum.OutputFormatEnum.FORMAT_16BITS}, 
                    aInheritance= {sbsenum.CompNodeParamEnum.OUTPUT_FORMAT:sbsenum.ParamInheritanceEnum.ABSOLUTE}) 
 
# Create a function and put it under a new folder 'Functions' 
myFunction = sbsDoc.createFunction(aFunctionIdentifier = 'myFct', aParentFolder = 'Functions') 
 
# Create a new graph from a template 
# All the content of the template graph and its resources / dependencies will be added to the edited Substance 
copyGraph = sbsDoc.createGraph(aGraphIdentifier = 'CopyGraph', 
                    aTemplate = 'my/Template/Absolute/Path.sbs/graphToCopy', 
                    searchForExistingReferenceByIdentifier = True, 
                    copyInternalReferencedObjects = True) 
 
# Resource creation 
myRes = sbsDoc.createLinkedResource(aResourcePath = 'my/Resource/Absolute/Path.png', 
                    aResourceTypeEnum = sbsenum.ResourceTypeEnum.BITMAP) 
 
# Graph edition 
############### 
xOffset = [192,0,0] 
 
# Get the graph created with the document 
demoGraph = sbsDoc.getSBSGraph(aGraphIdentifier = 'DemoGraph') 
 
# - Bitmap node that uses the previously created resource 
# (this method can also create the resource if an absolute path is given) 
bitmapNode = demoGraph.createBitmapNode(aSBSDocument = sbsDoc, 
                    aResourcePath = myRes.getPkgResourcePath(), 
                    aParameters   = {sbsenum.CompNodeParamEnum.COLOR_MODE:sbsenum.ColorModeEnum.COLOR}) 
 
# - Instance of Blur HQ from the default package library 
blurHQNode = demoGraph.createCompInstanceNodeFromPath(aSBSDocument = sbsDoc, 
                    aPath       = 'sbs://blur_hq.sbs/blur_hq', 
                    aGUIPos     = bitmapNode.getOffsetPosition(xOffset), 
                    aParameters = {'Intensity':3.2}) 
 
# - Output node with the usage baseColor 
outputNode = demoGraph.createOutputNode(aIdentifier = 'DemoOutput', 
                    aGUIPos       = blurHQNode.getOffsetPosition(xOffset), 
                    aOutputFormat = sbsenum.TextureFormatEnum.DEFAULT_FORMAT, 
                    aUsages       = {sbsenum.UsageEnum.BASECOLOR: sbsenum.ComponentsEnum.RGBA}) 
 
aGraph.connectNodes(aLeftNode = bitmapNode, aRightNode = blurHQNode) 
aGraph.connectNodes(aLeftNode = blurHQNode, aRightNode = outputNode) 
 
# Write the document 
sbsDoc.writeDoc()

Get help faster and easier

New user?