前端开发
用 Substance 3D Painter 制作 PBR…
在需要为 Three.js、Babylon.js、Unity、Unreal 或 glTF 创建和导出 PBR 贴图(含批量自动化)时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 Substance 3D Paint特定
解决思路
- 采用 metallic/roughness PBR 工作流,核心贴图通道包括 baseColor、normal、metallic、roughness,附加通道有 ambientOcclusion、height、emissive、opacity。
- 导出时选择内置预设:Web 引擎统一使用 "PBR Metallic Roughness",其他可选 Unity HDRP/URP、Unreal Engine、Arnold (AiStandard)。
- 分辨率按 2 的幂选择:512×512 低细节/移动端,1024×1024 标准,2048×2048 主角资产,4096×4096 展示级(谨慎使用);Web 优化规则是从 1024×1024 起步,仅在细节可见时放大。
- 手动单套导出:File → Export Textures,选择 "PBR Metallic Roughness" 预设,输出目录自选,格式 PNG (8-bit),Padding 设为 "Infinite",分辨率 1024×1024,导出后得到 baseColor、normal、metallicRoughness(R 空、G=roughness、B=metallic)、可选 emissive。
- 在 Three.js 中用 MeshStandardMaterial 加载:map=baseColor、normalMap=normal、metalnessMap 与 roughnessMap 共用 metallicRoughness、aoMap=ambientOcclusion。
- 用 Python API 批量导出:通过 substance_painter.export.export_project_textures(config) 执行,config 中设置 exportShaderParams=False、exportPath、defaultExportPreset、exportList(遍历 all_texture_sets() 添加 rootPath)、exportParameters(fileFormat=png、bitDepth=8、dithering=True、paddingAlgorithm=infinite、sizeLog2=10 即 1024)。
- 按资产覆盖分辨率:在 exportParameters 中用 filter.dataPaths 指定资产名,分别设置 sizeLog2(如 11=2048、9=512)。
- 创建自定义导出预设分离通道:定义 exportPresets 中每个 map 的 fileName 与 channels(destChannel、srcChannel、srcMapType=documentMap、srcMapName),可分别导出 metallic 与 roughness 为独立文件。
- 移动端优化导出:baseColor 用 JPEG(有损但更小),数据贴图(normal、metallicRoughness)用 PNG 无损,sizeLog2=9(512×512 上限),paddingAlgorithm=infinite;导出后用 pngquant 或 tinypng 进一步压缩。
- glTF/GLB 集成:用 PBR Metallic Roughness 预设导出 PNG 8-bit、sizeLog2=10、paddingAlgorithm=infinite,然后在 glTF JSON 的 pbrMetallicRoughness 中引用 baseColorTexture 与 metallicRoughnessTexture,normalTexture 单独引用。
- 事件驱动自动导出:用 substance_painter.event.DISPATCHER.connect 监听 ProjectSaved 事件,在回调中检查 project.is_open(),构建 config 并调用 export_project_textures 实现保存即导出。
- 在 React Three Fiber 中用 useTexture 加载多张贴图并传给 meshStandardMaterial 的 map、normalMap、metalnessMap、roughnessMap、aoMap。
- 在 Babylon.js 中用 PBRMaterial:albedoTexture、bumpTexture、metallicTexture,并设置 useRoughnessFromMetallicTextureAlpha=false、useRoughnessFromMetallicTextureGreen=true、useMetallnessFromMetallicTextureBlue=true。
- glTF 管线中用 gltf-pipeline 做 Draco 压缩:gltf-pipeline -i model.gltf -o model.glb -d。
- 控制贴图内存预算:桌面 WebGL 约 100-150MB,移动 WebGL 约 30-50MB;背景/道具 512×512(4 张约 4MB),标准资产 1024×1024(约 16MB),主角资产 2048×2048(约 64MB)。
- 压缩策略:baseColor 用 JPEG(70-80% 质量,比 PNG 小约 10 倍),数据贴图用 PNG-8 无损,可用 Basis Universal (.basis) 做 GPU 压缩(约小 90%),或用贴图图集合并多个资产。
- 通道打包:将 AO、Roughness、Metallic 打包进 ORM 贴图的 R/G/B 通道以减少贴图数量,在 Substance 中通过 channels 映射 ambientOcclusion→R、roughness→G、metallic→B。
- 始终在引擎中启用 mipmaps:Three.js 设 texture.generateMipmaps=true,Babylon.js 用 Texture.TRILINEAR_SAMPLINGMODE。
- 修正 baseColor 色彩空间:Substance 默认以 sRGB 导出(正确),Three.js 中设 baseColorTexture.colorSpace=THREE.SRGBColorSpace,Babylon.js 对 albedoTexture 自动处理。
- 处理法线贴图:确认切线空间格式(DirectX vs OpenGL Y-flip),Substance 用 OpenGL (Y+),与 glTF 标准一致;若用于 DirectX 引擎则在导出时翻转绿色通道。
- 确认 metallic/roughness 通道顺序:默认 Substance 导出为 Blue=Metallic、Green=Roughness,符合 glTF 2.0 规范。
- 消除 UV 接缝伪影:导出设置中 paddingAlgorithm 设为 "infinite"。
- 避免 Web 贴图过大:默认 1024×1024,仅近距离主角资产用 2048×2048,并实现多分辨率 LOD 系统。
- 解决 AO 贴图不显示:Three.js 需要第二 UV 通道(geometry.attributes.uv2),Babylon.js 设 material.useAmbientOcclusionFromMetallicTextureRed=true,或直接在 Substance 中把 AO 烘焙进 baseColor。
适用边界 · 注意事项
- 不使用 Adobe Substance 3D Painter 或不做 PBR 贴图时。
- 目标平台不需要实时渲染优化(如离线渲染)时。
- 没有 Python 环境或不需要批量/自动化导出时。