最近学习研究了一下sd 的python脚本,做了个小练习,将sbs或者sbsar文件渲染成一张缩略图。
经查阅,Substance Automation Toolkit工具好像可以实现离线的方式创建出缩略图,但是我没有这个工具包····,遂在论坛上逛了逛,发现了一个节点:PBR Render。通过下图所示,就可以得到一张材质的缩略图,就按照这个思路,开始我们的脚本。
具体流程如下:
我们一步一步看具体实现步骤:
获取当前的Graph,和package
ctx = sd.getContext()
app = ctx.getSDApplication()
UIMgr = app.getQtForPythonUIMgr()
currentGraph = UIMgr.getCurrentGraph()
pkgMgr = app.getPackageMgr()
currentpackage = pkgMgr.getUserPackages().getItem(0)
接下来创建PBR Render Node:
def createPBRRenderNode(app, pkgMgr, currentGraph):
# create PBR Rendoer Node
resourcePath = app.getPath(SDApplicationPath.DefaultResourcesDir)
package = pkgMgr.loadUserPackage(os.path.join(resourcePath, 'packages', 'pbr_render_ortho.sbs'))
packageName = 'PBR_render_ortho'
instanceNode = currentGraph.newInstanceNode(package.findResourceFromUrl(packageName))
instanceNode.setInputPropertyValueFromId('shape', SDValueInt.sNew(1))
instanceNode.setInputPropertyValueFromId('envrionment_horizontal_rotation', SDValueFloat.sNew(0.06))
instanceNode.setInputPropertyValueFromId('background_color', SDValueColorRGBA.sNew(ColorRGBA(0, 0, 0, 0)))
return instanceNode
因为PBR Render 节点是SD官方的,所以先获取到默认的资源路径,可以在ATTRIBUTES下看到,Package位置和名字:
通过loadUserPackage将包导入,newInstanceNode函数将该节点添加到当前Graph。因为PBR Render节点默认的shape是正方形,而且背景是黑色的,所以这里我又设置了三个属性,将shape设置为sphere,水平旋转0.06,背景改成透明。
我将创建环境图和连接写在了一起:(通过仔细观察,法线galazed这张环境图就是painter shelf中basematerial所采用的环境图)
def linkEnvironmentMap(app, pbrRenderNode, package, currentGraph):
resourcePath = app.getPath(SDApplicationPath.DefaultResourcesDir)
envMapPath = resourcePath + '/view3d/maps/glazed_patio.exr'
envMap = SDResourceBitmap.sNewFromFile(package, envMapPath, EmbedMethod.Linked)
envMapNode = currentGraph.newInstanceNode(envMap)
envMapNode.newPropertyConnectionFromId('unique_filter_output', pbrRenderNode, 'environment_map')
创建过程和之前基本一样,用newPropertyConnectionFromId()将两个节点连接起来,这个函数以后还会用到。
newPropertyConnectionFromId(sdOutputPropertyId,sdInputPropertyNode,sdInputPropertyId)
这里可能比较麻烦的就是需要知道要连接两端的id。官方文档中有方法,这里我就不再重复写了。
https://docs.substance3d.com/sddoc/nodes-and-properties-172825056.htmldocs.substance3d.com做到这里我们就得到了一个最基础的“模板”:
接下来的内容暂时与SD API无关,我们需要获取需要处理的材质的列表。
拿出我最常用的遍历文件的函数:
MaterialPathList = []
def getMaterialList(rootpath):
for i in os.listdir(rootpath):
path = os.path.join(rootpath, i)
if path.split('')[-1] == '.autosave' or path.split('')[-1] == 'dependencies':
continue
filename = path.split('')[-1]

本文介绍了如何使用Python脚本在Substance Designer中创建缩略图。通过PBR Render节点,结合SD API,实现从.sbs或.sbsar文件自动生成缩略图。详细阐述了脚本的实现步骤,包括连接不同节点,处理各种属性ID,以及最终计算和保存缩略图的过程。此外,还提到了解决没有输出图的问题和创建SD插件的方法,以方便日常使用。
最低0.47元/天 解锁文章
219

被折叠的 条评论
为什么被折叠?



