Files
XCEngine/docs/api/XCEngine/Rendering/RenderMaterialUtility/TryBuildBuiltinPassResourceBindingPlan.md

63 lines
2.3 KiB
Markdown
Raw Normal View History

# TryBuildBuiltinPassResourceBindingPlan
**命名空间**: `XCEngine::Rendering`
**类型**: `function`
**头文件**: `XCEngine/Rendering/Builtin/BuiltinPassLayoutUtils.h`
## 签名
```cpp
bool TryBuildBuiltinPassResourceBindingPlan(
const Containers::Array<Resources::ShaderResourceBindingDesc>& bindings,
BuiltinPassResourceBindingPlan& outPlan,
Containers::String* outError = nullptr);
```
## 作用
2026-04-08 16:07:03 +08:00
把 shader 显式声明的资源绑定列表解析成 builtin pipeline 可直接消费的统一 binding plan。
## 当前实现行为
1. 先把 `outPlan` 重置为空。
2. 如果 `bindings.Empty()`,直接返回 `true`,保留空 plan。
3. 逐条绑定执行:
2026-04-08 16:07:03 +08:00
- 通过 [ResolveBuiltinPassResourceSemantic](ResolveBuiltinPassResourceSemantic.md) 解析 builtin 语义
- 通过 [IsBuiltinPassResourceTypeCompatible](IsBuiltinPassResourceTypeCompatible.md) 校验语义与资源类型
- 拒绝同一 builtin 语义重复出现
2026-04-08 16:07:03 +08:00
- 拒绝同一 `set/binding` 对重复出现
- 回填 `bindings``usesConstantBuffers``usesTextures``usesSamplers`
- 更新 `perObject``material``lighting``shadowReceiver`、纹理与采样器槽位
4. 最终计算:
- `firstDescriptorSet = 最小 set`
- `descriptorSetCount = 最大 set - 最小 set + 1`
## 失败条件
2026-04-08 16:07:03 +08:00
当前会返回 `false`,并在 `outError` 可用时写入错误字符串:
- 解析出 `Unknown` 语义
2026-04-08 16:07:03 +08:00
- 语义与 shader 资源类型不兼容
- 同一 builtin 语义出现多次
2026-04-08 16:07:03 +08:00
- 同一 `set/binding` 对出现多次
## 当前边界
2026-04-08 16:07:03 +08:00
- 它只解析调用方传入的显式 `bindings` 列表,不再负责生成 legacy fallback 绑定描述。
- 这里还不会检查“是否缺少 `PerObject`”或“同一 set 是否混用 sampler / 非 sampler”这些更靠后的布局规则属于 `BuiltinForwardPipeline` / `BuiltinObjectIdPass` 的后续阶段。
## 测试覆盖
`tests/Rendering/unit/test_builtin_forward_pipeline.cpp` 当前验证了:
- 显式 `ForwardLit` / `Unlit` shader 资源声明能正确落成 plan
2026-04-08 16:07:03 +08:00
- 显式 object-id / depth-style 资源声明也能正确落成 plan
- 语义重复、`set/binding` 重复和语义/类型不兼容时会返回失败
## 相关文档
- [BuiltinPassResourceBindingPlan](BuiltinPassResourceBindingPlan.md)
- [RenderMaterialUtility](RenderMaterialUtility.md)