共计 1724 个字符,预计需要花费 5 分钟才能阅读完成。
痛点分析:为什么需要自动化?
每次做完一个 3D 场景,最头疼的就是处理几十个材质球和模型文件。手动操作至少要经历这些步骤:

- 逐个检查材质贴图分辨率
- 用图像软件压缩每张纹理
- 反复确认压缩后效果
- 手动更新 Blender 中的材质链接
更可怕的是,当项目需要迭代时:
- 同事修改了贴图但忘记压缩
- 不同版本的资源混在一起
- 最终打包时才发现体积超标
技术方案:为什么选择 Python 脚本?
Blender 内置的 bpy 模块提供了完整的 Python API 控制能力,相比其他方案有三大优势:
- 无需环境配置:Blender 自带 Python 解释器
- 实时调试:脚本编辑器可以立即看到修改效果
- 功能全面:从场景遍历到渲染设置都能控制
代码实现:从零编写压缩脚本
基础框架搭建
import bpy
import os
# 常量定义
TARGET_SIZE = 1024 # 目标纹理尺寸
QUALITY = 75 # JPEG 压缩质量
# 主函数
def optimize_scene():
# 后续步骤将在这里实现
pass
if __name__ == "__main__":
optimize_scene()
场景遍历逻辑
- 添加材质处理器:
def process_material(mat):
if not mat.use_nodes:
return
for node in mat.node_tree.nodes:
if node.type == 'TEX_IMAGE':
image = node.image
if image: # 确保纹理已加载
optimize_texture(image)
- 实现纹理优化核心方法:
def optimize_texture(img):
# 跳过已压缩的纹理
if img.filepath.endswith('.jpg'):
return
# 计算缩放比例
scale = TARGET_SIZE / max(img.size[0], img.size[1])
if scale < 1.0:
img.scale(int(img.size[0] * scale),
int(img.size[1] * scale))
# 转换为 JPEG 格式
temp_path = bpy.path.abspath("//temp_compressed.jpg")
img.save_render(temp_path, quality=QUALITY)
# 重新加载压缩后的纹理
img.filepath = temp_path
img.reload()
- 完整场景遍历:
def optimize_scene():
# 处理所有材质
for mat in bpy.data.materials:
process_material(mat)
# 处理世界环境贴图
if bpy.context.scene.world.use_nodes:
for node in bpy.context.scene.world.node_tree.nodes:
if node.type == 'TEX_ENVIRONMENT':
optimize_texture(node.image)
性能考量:压缩格式对比测试
在相同场景下的测试数据:
| 格式 | 文件体积 | 加载时间 | 显存占用 |
|---|---|---|---|
| PNG | 12.4MB | 320ms | 48MB |
| JPEG | 3.7MB | 210ms | 32MB |
注意:
– 透明通道必须用 PNG
– 法线贴图建议保持无损格式
避坑指南
UV 映射损坏预防
压缩后若发现 UV 错乱:
- 检查脚本中是否误修改了 UV 坐标
- 确保没有执行
img.pack()方法 - 复杂材质建议先备份原始文件
其他常见问题
- 纹理丢失:检查文件路径是否包含中文
- 颜色异常:确认 JPEG 压缩质量不低于 70
- 性能下降:禁用脚本中的实时预览
img.update()
扩展建议
掌握基础脚本后,可以尝试:
- 自动生成不同级别的 LOD 模型
- 根据显存大小动态调整压缩比例
- 集成到 Blender 的导出流程中
# LOD 生成示例
bpy.ops.object.modifier_add(type='DECIMATE')
obj.modifiers["Decimate"].ratio = 0.5
调试技巧
- 使用
print(dir(obj))查看对象可用属性 - 在文本编辑器开启行号方便定位错误
- 复杂操作建议分阶段执行脚本
现在可以尝试用 Ctrl+Space 调出代码补全,慢慢探索更多自动化可能。刚开始可能需要反复调试,但一旦脚本成熟,节省的时间会远超你的预期。
正文完
