编程技术文章分享与教程

网站首页 > 技术文章 正文

用于单帧的搅拌器网络渲染(计算器:搅拌机)

hmc789 2024-11-15 19:34:01 技术文章 2 ℃

Blender 用户一直在尝试各种有趣的方法,以加快单个计算机上的单个图像的渲染时间。

某些方法包括脚本在单独的 GPU 之间拆分渲染,在 CPU 和 GPU 之间拆分渲染负载,或者用随机种子以低得多的采样率渲染多个图像,然后 Alpha 将它们合并在一起。

这对于一台机器来说很好,但是即使你只有两台计算机,那也是潜在的渲染速度的两倍!Blender 在渲染动画时使用占位符和共享存储,在计算机之间拆分工作负载的方法简单而有力。不幸的是,它只在帧级别拆分工作负载。如果您只渲染单个图像,但希望利用单独的网络连接计算机,则如何呢?

少数渲染服务器场服务支持他们称之为"拆分和拼接"的东西,其中它们细分视口,并在多个计算机上呈现每个部分。单个 Blender 用户通常拥有对渲染场的本地访问权限,但此脚本模拟了该行为 -无论您是有权访问 2 台计算机还是 200 台计算机。Blender 有这些辣椒有一段时间了, 但这自动化了这个过程。去和你的朋友一起汇集你的计算能力,或者启动50台临时数字海洋机器,使你的混合地狱。

要求

没有外部依赖关系,但此脚本对您的环境有一些假设。首先,它不是一个普通的搅拌机插件。您可能想要在与混合文件相同的目录中运行它。与在渲染动画时使用占位符运行 Blender 一样,假定包含混合文件的目录位于某种共享存储(NFS、SMB,无论什么)上,并且所有参与的渲染计算机都有权访问它。

它还假定您能够从命令行跨所有参与计算机运行搅拌机。你怎么做完全取决于你。您可以使用商业作业运行程序,如Qube或拖拉机,或ssh包装,如集群或者,香草 ssh,您只需在每台计算机上复制并粘贴命令。你的电话!

限制

图像目前仅分为 100 个部分。如果您有超过 100 台机器可供使用,有些机器将处于空闲状态。(这应该是可调的,我可能会修改它以后是一个选项。

您只剩下平铺图像了——如何将它们重新放入已完成的图像中完全取决于您的管道。然而,梦幻般的ImageMagick包包括一个程序称为 ,它可以非常快速地拼接完成的图像

目前不支持渲染动画。我想这不难添加 - 每个帧在它自己的子文件夹?也许以后吧

使用

让我们说,你有3台机器,你的混合文件在一个目录,可以访问所有这些。将此脚本复制到该目录中。确保所有设置都以您喜欢的方式(示例、光反弹、输出格式、大小等)在混合文件中拨号。然后,在每台机器上运行搅拌机:

machine-1nbsp;blender file.blend -b -P chunked_render.py
machine-2nbsp;blender file.blend -b -P chunked_render.py
machine-3nbsp;blender file.blend -b -P chunked_render.py

这 3 台机器将分配工作,您的图像将呈现 3 倍的速度(假设硬件类似)。

完成后,您将留下 100 个单独的输出文件,标记为"chunk_XXX.png"。如果安装了 ImageMagick,将它们重新组合到最终映像的最简单方法是通过以下内容(只需在一台计算机上):

machine-1nbsp;montage -background none -mode concatenate -tile 10x10 chunk_* rendered.png

这使用环境变量,因此不必对文件进行手动编辑来更改设置。
示例用法:
TILE_X=10 TILE_Y=10 PERCENT=1000 blender -b /path/to.blend -P render_tiles.py
您还可以以非常高的分辨率保存文件,并省略 var(
将设置为 。PERCENT100
完成后,将打印加入图像的蒙太奇命令。
这取决于 ImageMagick 的蒙太奇命令,例如:
Run this command to join images:
    montage -tile 10x10 -border 0 -mode concatenate '/tmp/render_*.*' final.png
下面是脚本:render_tiles.py
def main():
    import os    import bpy    from bpy import context

    scene = context.scene
    render = scene.render

    tiles_x = int(os.environ.get("TILE_X", "4"))
    tiles_y = int(os.environ.get("TILE_Y", "4"))
    resolution_percentage = int(os.environ.get("PERCENT", "100"))

    slice_x = 1.0 / tiles_x
    slice_y = 1.0 / tiles_y    # use border and crop
    render.use_border = True
    render.use_crop_to_border = True

    # set resolution percentage
    render.resolution_percentage = resolution_percentage

    filepath_orig = render.filepath    # track progress
    tiles_done = 0
    tiles_total = tiles_x * tiles_y    for div_y in range(tiles_x):        for div_x in range(tiles_y):

            render.border_min_x = slice_x * div_x
            render.border_max_x = slice_x * (div_x + 1)
            render.border_min_y = 1.0 - (slice_y * (div_y + 1))
            render.border_max_y = 1.0 - (slice_y * div_y)

            cell_name = "%04d_%02d_%02d" % (tiles_done + 1, div_x + 1, div_y + 1)

            render.filepath = "%s_%s" % (filepath_orig, cell_name)

            bpy.ops.render.render(write_still=True)

            print("Rendered %s (%d of %d)" % (cell_name, tiles_done, tiles_total))

            tiles_done += 1

    print("Finished: %d tiles" % tiles_done)

    print("Run this command to join images:")
    print("    montage -tile %dx%d -border 0 -mode concatenate %r final.png" %
          (tiles_x, tiles_y, bpy.path.abspath(filepath_orig) + "*.*" ))if __name__ == "__main__":
    main()

这应该很快完成。这就是它的所有。


标签列表
最新留言