# Pli — Blender 移交包，版本 1.0.0

RenderParcel 的一项原创研究：紫色陶瓷瓶身、橙色缎面领圈、人字纹纸质标签与黏土底座。构图面向产品图设计，左侧留有空白区域。它既不是客户物件，也不是从照片复刻的模型。

## 下载内容实际上包含什么

本包提供一个**场景生成器**、一张原创纹理、一份配方和若干校验。在准备环境中没有生成任何 `.blend` 文件或 Blender 渲染：该环境中未找到 Blender。所执行的验证针对文件、路径、PNG、Python 语法和依赖错误。请阅读 `VALIDATION.md`。

重建目标是 **Blender 4.5.x LTS**，使用其内置 Python 与 Cycles。脚本会拒绝其他分支，以避免把假定的兼容性当作测试结果。不需要任何外部 Python 模块、Blender 扩展、字体、HDRI 或模型。独立的 Python 3.10+ 即可完成文件夹校验；所提供的测试是在 Windows 下用 Python 3.14.6 执行的。

## 目录结构与入口

```text
blender-v1/
  README.md, LICENSE.txt, VALIDATION.md
  scene.json                    配方、版本、依赖与输出
  manifest.sha256.json          所分发文件的大小与 SHA-256
  generate_scene.py             需在 Blender 内运行的入口
  inspect_scene.py              在第二个 Blender 中打开检查
  validate_pack.py              无需 Blender 的文件校验
  01_sources/make_texture.py    PNG 的原创配方
  02_projet/                    接收重建后的 .blend
  03_ressources/pli-chevron.png 需保留的 sRGB 纹理
  04_caches/                    该固定场景无缓存
  05_rendus/                    如需则接收 CPU 预览
  06_livraison/                 执行后的验收单与报告
```

清单覆盖所分发的文件，但不包含它自身，以避免循环指纹。之后创建的输出不属于该清单。指纹只能检测文件差异；它既不证明文件来源，也不证明其外观。若用于你自己的交付，请创建一个带日期的全新清单，纳入已批准的输出。

## 1. 打开 Blender 之前先解压并校验

将 ZIP 解压到一个新文件夹，然后在 `blender-v1` 根目录打开终端。不要仍在压缩状态的归档内部执行任何命令。

```sh
python validate_pack.py --root . --json
```

结果必须包含 `"ok": true`，且退出码必须为 0。文件缺失、被篡改、位于文件夹之外或 PNG 无效都会导致失败（退出码 1）。若校验失败，请在此停止。不要为了掩盖错误而重写清单。

在 Windows 下，可用 `py -3` 替代 `python`。下文的 `blender` 应指向你的 Blender 4.5.x 可执行文件；若其所在文件夹不在 PATH 中，请使用带引号的完整路径（在 PowerShell 中该路径前需加 `&`）。

## 2. 在专用的 Blender 进程中重建

脚本会在内存中重建一个空场景；请勿在未保存的项目中运行它。在解压后的文件夹中：

```sh
blender --background --factory-startup --python-exit-code 1 --python generate_scene.py -- --render-preview
```

该命令应生成：

- `02_projet/renderparcel_pli_v1.blend`：固定场景、第 1 帧、相机 `Pli_Camera`、Cycles CPU、1 200 × 750 像素、64 采样；
- `05_rendus/pli_controle_cpu.png`：**若渲染成功**，480 × 300 像素、16 采样、无降噪的 CPU 预览；
- `06_livraison/reconstruction.json`：实际使用的 Blender 版本、对象、所选设备以及渲染的实际状态。

去掉 `-- --render-preview` 即可仅构建 `.blend`。此时报告将显示 `renderExecuted: false`。脚本会在缩减计算之前按工作定义保存场景；因此 `.blend` 不会被预览设置替换。这些命令绝不会启用 GPU。

已存在的输出会被拒绝。若要重新尝试，请将包重新解压到另一个文件夹，而不要覆盖已保留的结果。异常会通过 `--python-exit-code 1` 上报给系统；若失败，请保留终端消息。

## 3. 在第二个进程中重新打开场景

```sh
blender --background --factory-startup --python-exit-code 1 --python inspect_scene.py
```

该检查在不执行其内部脚本的情况下打开 `.blend`，验证十个对象、摄像机、Cycles CPU、各项设置、单帧范围、AgX、内嵌纹理及其相对路径。结果写入 `06_livraison/inspection-blender.json`。此检查不评估图像的美观程度，也不替代对图像的查看。

随后用图像查看器打开该 PNG。**复制** `06_livraison/modele-reception.csv` 到一个新文件 `06_livraison/reception-executee.csv`，然后填写该副本：完整瓶身位于画面内、正面有奶油色/紫色/橙色图案、与底座接触、无品红色纹理、反光清晰可辨。模板保持不变以保留其指纹；填写后的副本是需在你自己的交付中清点的输出。这些标准是重建后需验证的意图；分发的版本中不包含任何 Blender 参照渲染。

## 4. 在没有旧资源的情况下验证传输

将**整个重建后的文件夹**复制到目标机器，或复制到无法访问创作工作站路径的环境中。先运行文件检查，再打开 `.blend` 的副本。如果旧的绝对路径仍然可用，仅在同一工作站上移动文件是不够的。

外部纹理保留在 `03_ressources` 中。在 `.blend` 中，预期路径为 `//../03_ressources/pli-chevron.png`，因为 `//` 相对于位于 `02_projet` 中的 Blender 文件。生成器加载纹理，然后在保存前通过 `Image.pack()` 将其内嵌。这两种形式允许在控制内嵌的同时修改源文件；修改后，重新加载/内嵌并保存选定的版本。

对于现有项目：保存到目标文件夹；使用 File → External Data → Make Paths Relative；运行 Report Missing Files。Find Missing Files 可以修复链接，但会使其变为绝对路径：需再次检查。Pack Resources 不包含所有外部数据，尤其是视频。链接库需要各自的流程；此包不使用任何链接库。

## 5. 将配方适配到你的项目

先从一份独立的副本开始，因为对源文件的任何修改都会使原始清单失效。将软件/版本、摄像机、场景、引擎、分辨率、采样数、显示变换、纹理、扩展以及输出目标保存在一份独立的清单中。包中的 PNG 是 sRGB 基础色，不是法线贴图或置换贴图。

此场景**不使用任何动画、任何模拟缓存、任何声音、任何字体或链接库**。如果你添加烟雾、布料或动画几何体，请清点缓存类型、其位置、完整范围以及预计算流程。在复制前冻结缓存。检查中间帧以及序列中的每个文件：一张正确的第 1 帧并不能验证整段动画。

ZIP 的体积并不衡量渲染的显存占用。缩小的 CPU 预览无法用来估算 GPU 耗时。要为你的制作做规模评估，请以最终分辨率测量你的完整场景，并核查内存峰值，为其高负载阶段留出余量。在验收前保留一份独立备份。

## 纹理重建（可选）

```sh
python 01_sources/make_texture.py --output 05_rendus/motif-reconstruit.png
```

图案的计算是确定性的，仅使用整数运算。在已发布的测试中，使用同一 zlib 库时，重建的 PNG 字节与交付文件一致。在不同压缩版本之间，还应比较像素，而不是假定压缩后的字节完全相同。

## 流程的来源

- [Blender 4.5 手册，打包数据](https://docs.blender.org/manual/sr/4.5/files/blend/packed_data.html)：Pack Resources 的范围、保存与链接库。
- [Blender 4.5 手册，外部数据](https://docs.blender.org/manual/ja/4.5/interface/window_system/topbar.html)：相对路径与缺失文件的查找。
- [Blender 4.5 API，Wm 操作符](https://docs.blender.org/api/4.5/bpy.ops.wm.html)：在禁用内部脚本的情况下保存和打开。
- [Blender 4.0 API，Image](https://docs.blender.org/api/4.0/bpy.types.Image.html)：外部/内嵌图像与 `pack` 操作；本准备期间查阅了可访问的参考页面，4.5 页面当时无法访问。
- [Blender 4.5 手册，命令行](https://docs.blender.org/manual/es/4.5/advanced/command_line/arguments.html)：脚本执行与 Python 退出码。
- [Blender 4.5 手册，色彩管理](https://docs.blender.org/manual/sr/4.5/render/color_management.html)：纹理的解释与显示变换。
- [Blender 4.5 手册，预计算](https://docs.blender.org/manual/fr/4.5/physics/baking.html)：缓存与模拟范围的分别处理。

当英文页面无响应时，使用官方译文。它们记录操作，但不取代仍需进行的 Blender 实测。商业链接与 GPU 选择位于 RenderParcel 指南中，而非技术配方中。

## 旧版文件夹的兼容性

新的重建会保存 `02_projet/renderparcel_pli_v1.blend`。已创建的文件不会被移动或重命名。如果这一新输出不存在，`inspect_scene.py` 仍可打开 `02_projet/prismora_pli_v1.blend`，即历史输出名称。如果两个文件都存在，检查会优先选择新输出。

模式标识符 `prismora.blender-transfer.v1` 和 `prismora.integrity.v1`、技术属性 `prismora_pack_version` 和 `prismora_purpose`，以及内部模块名 `prismora_validator`，在读取 v1 文件夹时保持稳定。它们是兼容性键，而非文件夹的显示品牌。
