Blender自动化脚本,无人值守批量渲图/渲视频

渲染视频是个非常耗时的大工程,如果要渲染多个视频或者每个视频还需要切换不同的贴图、颜色等,工作量就更离谱了,所以不得不用脚本实现自动化。

Blender的脚本是用Python编写,比PS的js要方便很多。再下载一套Blender对应版本的API,就可以拥有代码提示功能。

Blender API下载,选择Blender对应版本即可:

Releases · nutti/fake-bpy-module · GitHub

例如我下载的是Blender 3.4的版本,下载后解压文件夹fake_bpy_modules_3.4-20230117,在该文件夹中创建Python脚本,并用VS Code打开fake_bpy_modules_3.4-20230117整个文件夹,VS Code需安装Python插件以支持代码提示。

首先在Blender中新建一个模型,Blender界面如图:

以通过脚本动态修改一个模型的贴图为例,可通过脚本Blender API bpy.context.scene访问Scene面板的所有结点,例如我们要修改"猴头"模型的贴图,首先就需要获取到"猴头"节点,然后获取到名为"材质"的材质球,然后获取到材质球里的贴图节点,重新指定贴图文件路径:

  1. 获取场景中名为"猴头"的节点:tNode:bpy.types.Object = bpy.context.scene.objects["猴头"]

  2. 获取该节点的材质球:mat:bpy.types.MaterialSlot = tNode.material_slots["材质"]

  3. 获取材质球中名为"图像纹理"的节点:texNode:bpy.types.ShaderNodeTexImage = mat.material.node_tree.nodes["图像纹理"]

  4. 修改贴图文件:texNode.image.filepath = "newTexture.png"

  5. 修改完贴图调用texNode.image.update()以刷新渲染

把同一模型,不同贴图,每张贴图为模型渲一张图:

  1. 首先把需要动态切换的多张贴图放到指定文件夹下,以便用程序获取该文件夹下的所有贴图;

  2. 遍历所有贴图,把当前贴图按照上述流程设置到模型材质球上,然后渲染出图片。这样就能得到不同贴图的渲染图;

  3. 执行bpy.ops.render.render()开始渲染图片;

渲染视频的方式同理,在Blender如下面板可选择File Format属性以设置渲染视频还是图片。

可以在代码中判断当前Blender中选择的File Format,如果为视频则开启动画渲染,否则按图片渲染。

代码如下:

python 复制代码
import bpy
import os
import glob
import os.path

texFolder = "C:/Users/Administrator/Desktop/Models/icons"

outputPrefixName = "Image_"
outputVideoPrefixName = "Video_"
tNode:bpy.types.Object = bpy.context.scene.objects["猴头"]
if not tNode:
    print("找到目标节点")
else:
    mat:bpy.types.MaterialSlot = tNode.material_slots["材质"]
    texNode:bpy.types.ShaderNodeTexImage = mat.material.node_tree.nodes["图像纹理"]

    # colTex = mat.material.node_tree.nodes["Color"]
    try : 
        texNode.image.unpack()
    except Exception as e:
        print("")


    # 根据给定贴图目录批量渲染

    texFiles:list[str] = glob.glob(os.path.join(texFolder, "*.png"))

    for texPath in texFiles:
        fileName = os.path.basename(texPath)
        texNode.image.filepath = texPath
        texNode.image.update()

        fileNameNoExt = os.path.splitext(fileName)[0]
        if bpy.context.scene.render.image_settings.file_format.startswith("AVI") or bpy.context.scene.render.image_settings.file_format == "FFMPEG":
            # 渲染avi视频
            bpy.context.scene.render.filepath = "//OutputVideos/"+outputVideoPrefixName + fileNameNoExt
            bpy.context.scene.render.use_overwrite = False
            bpy.context.view_layer.update()
            bpy.ops.render.render(animation=True)
        else:
            # 渲染图片
            bpy.context.scene.render.filepath = "//OutputImages/"+outputPrefixName + fileNameNoExt
            # bpy.context.scene.render.image_settings.file_format = "PNG"
            bpy.context.scene.render.use_overwrite = False
            bpy.context.view_layer.update()
            bpy.ops.render.render(write_still=True)

运行脚本:

  1. Blender中切换到脚本栏;

  2. 选择打开已经写好的脚本文件;

  3. 点击运行按钮,执行脚本;

执行完毕后就会在模型所在目录输出渲染图片/视频:

相关推荐
CG_MAGIC15 小时前
Blender幕后花絮:王国受袭——叛乱
3d·blender·贴图·建模教程·渲云渲染
overmind15 小时前
oeasy blender 004 在脚本工作区选择对象删除
blender
overmind15 小时前
oeasy blender 003 blender中的游乐场,用参数运行模式
blender
小趴菜克鲁里1 天前
游戏Excel配置自动化导出二进制工具链并生成对应配置类详解
游戏·自动化·excel
lihao lihao1 天前
页面自动化常见函数重点说明
运维·自动化
iambooo1 天前
基于日志的故障定位与自动化分析体系
运维·自动化
overmind2 天前
oeasy blender 002 工作区的控制
blender
belldeep2 天前
python:如何将豆包AI中历史对话 备份到本地 backup目录下?
人工智能·python·ai·自动化·backup·豆包
软希网分享源码2 天前
AIGC自动化编程实战(Python、Java、JavaScript和VBA) -2.9G课程
python·自动化·aigc
qq_454245032 天前
开源GraphMindStudio工作流引擎:自动化与AI智能体的理想核心
运维·人工智能·开源·c#·自动化