网站首页 > 技术文章 正文
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()
这应该很快完成。这就是它的所有。
猜你喜欢
- 2024-11-15 CSS3+JS实现静态圆形进度条(css 圆形进度条)
- 2024-11-15 前端必读榜——如何在React中用SpreadJS导入/导出Excel文件
- 2024-11-15 Svelte教程翻译(六、生命周期)(servelet生命周期阶段)
- 2024-11-15 uniapp(Vue) 实现可粘贴的 个性化验证码 输入框
- 2024-11-15 国产开源,GoLang也可以高效处理Excel的利器了
- 2024-11-15 css精髓:这些布局你都学废了吗?(css布局技术)
- 2024-11-15 Java 中的 AI:使用 Spring Boot 和 LangChain 构建 ChatGPT 克隆
- 2024-11-15 仅用18行JavaScript实现一个倒数计时器
- 2024-11-15 Web上的图片技巧「前端篇」(web网页图片)
- 2024-11-15 55个JS代码让你轻松当大神(完整的js代码)
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-