给模型做贴图是三维流程里公认的耗时环节。传统做法要么在 Substance Painter 里一笔一笔画,要么去贴图网站来回翻找素材,素材风格不统一的问题还经常出现。Stable Diffusion 出现之后,情况有了变化:只要写好提示词,几十秒就能得到一张风格可控的贴图。但大多数教程只讲怎么在网页里生图,真正把生成结果直接送进 Blender 材质节点的完整流程却很少有人讲清楚。这篇文章就围绕这个问题展开,带你用 Blender 内置的 Python 环境对接 Stable Diffusion API,实现从提示词到材质节点的自动化。

一、准备工作:API 服务与 Blender 脚本环境
整个方案的核心思路是在本地跑一个 Stable Diffusion 服务,然后让 Blender 通过 HTTP 请求去调用它。目前最常用的是 Automatic1111 版本的 WebUI,它自带一套 REST API,只要在启动时加上参数就能开启。具体做法是找到启动脚本 webui-user.bat,把其中的 COMMANDLINE_ARGS 改成如下内容:
set COMMANDLINE_ARGS=--api --listen call webui.bat
加上 --api 参数后,服务会在 127.0.0.1:7860 端口暴露一组接口,其中最常用的是 /sdapi/v1/txt2img,也就是文生图接口。启动成功后可以在浏览器访问 http://127.0.0.1:7860/docs 查看完整的接口文档,确认服务是否正常。
Blender 这边不需要安装任何额外软件,它自带的 Python 解释器已经包含 urllib 和 json 标准库,足够完成 HTTP 请求。打开 Blender 顶部菜单的 Scripting 工作区,新建一个文本文件就可以开始写代码。有一点需要注意:如果你的 Blender 版本较老,建议先升级到 3.x 以上,旧版本的 API 在图像数据写入方面有些不兼容的地方。
二、编写调用脚本:从提示词到 Blender 内的图像
下面是完整的脚本,功能是向本地的 Stable Diffusion 服务发送提示词,接收返回的 Base64 图片数据,并在 Blender 里创建一张真实可用的图像。这段代码可以直接粘贴到 Scripting 编辑器里运行。
import bpy
import urllib.request
import json
import base64
# 接口地址
url = "http://127.0.0.1:7860/sdapi/v1/txt2img"
# 请求参数,注意尺寸建议设为512的倍数
payload = {
"prompt": "seamless texture, rusty metal plate, high detail, tileable, pbr texture",
"negative_prompt": "seam, border, text, watermark",
"steps": 25,
"cfg_scale": 7,
"width": 1024,
"height": 1024,
"sampler_name": "DPM++ 2M Karras"
}
req = urllib.request.Request(
url,
data=json.dumps(payload).encode("utf-8"),
headers={"Content-Type": "application/json"}
)
with urllib.request.urlopen(req, timeout=300) as resp:
result = json.loads(resp.read().decode("utf-8"))
# 返回结果里的 images 字段是 Base64 编码的 PNG
img_data = base64.b64decode(result["images"][0])
# 写入临时文件再导入 Blender
import tempfile, os
tmp = os.path.join(tempfile.gettempdir(), "sd_texture.png")
with open(tmp, "wb") as f:
f.write(img_data)
img = bpy.data.images.load(tmp)
img.name = "SD_Texture"
print("贴图已生成:", img.name)脚本里有几个细节值得说明。首先是负向提示词,生成贴图时一定要加上 seam, border, text 这类词,否则画面边缘容易残留文字水印或明显的接缝痕迹。其次是尺寸参数,Stable Diffusion 对 512 的倍数支持最好,贴图常用 1024x1024,生成速度和质量比较均衡。
另外,timeout=300 不能省略。生成一张 25 步的图通常只需十几秒,但如果显存紧张触发了共享内存 fallback,耗时可能暴涨到几分钟,默认超时时间会让请求中途失败。Base64 解码后先落盘再导入,是因为 Blender 的 bpy.data.images.load 只接受文件路径,直接从内存创建像素数组虽然可行,但代码复杂不少,落盘方案更稳妥。
三、无缝化处理与材质节点接入
拿到的贴图要先解决平铺接缝问题。负向提示词只是缓解,真正可靠的做法是在提示词里显式加入 seamless texture, tileable 关键词,同时配合采样器参数调整。如果生成结果仍有接缝,可以在 Blender 的 Shader Editor 里给图像纹理节点后面接一个 Vector 类的 Box Mapping,利用三平面投影在模型上规避 UV 接缝,这是游戏资产制作里很常见的技巧。
接下来把图像接到材质上,这一步同样可以用脚本完成:
# 确保当前选中对象有材质
obj = bpy.context.active_object
mat = obj.active_material
nodes = mat.node_tree.nodes
# 清掉默认的原理化节点之外的杂项,新建图像纹理节点
tex_node = nodes.new("ShaderNodeTexCoord")
img_node = nodes.new("ShaderNodeTexImage")
img_node.image = bpy.data.images["SD_Texture"]
# 图像纹理接入基础色
bsdf = nodes.get("Principled BSDF")
mat.node_tree.links.new(img_node.outputs["Color"], bsdf.inputs["Base Color"])
mat.node_tree.links.new(tex_node.outputs["UV"], img_node.inputs["Vector"])这样一键就把生成的贴图挂到了原理化材质的基础色通道上。想进一步做 PBR 流程的话,可以重复调用接口生成法线贴图和粗糙度贴图,提示词分别写成 normal map 和 roughness map,然后把图像纹理节点的颜色空间设为 Non-Color,接到对应的输入端口即可。
四、常见问题与进阶思路
实际操作中最常见的报错是连接被拒绝,原因基本是 WebUI 没加 --api 参数启动,或者服务还没加载完模型。第二种常见问题是生成的贴图发灰发脏,这通常是提示词里缺少材质描述词导致的,建议固定一套模板,比如“材质主体 + 表面细节 + 光照描述 + tileable”,比临时想提示词稳定得多。
进阶方向可以把这套脚本封装成 Blender 插件,在侧边栏加一个输入提示词的面板,再配合 --controlnet 扩展把模型渲染图作为 ControlNet 的输入,实现基于模型形状的贴图生成。还能用 img2img 接口对现有贴图做风格重绘,比如把写实贴图一键转成手绘风格。整套流程跑通之后,从建模到出贴图可以在一个软件里完成,这对独立创作者来说是非常实际的效率提升。
BlenderStable Diffusion API纹理贴图修改时间:2026-09-08 16:27:13