feat: 透明材质 alpha blending——独立队列 + 线性 over 混合 + 距离排序

透明来源:glTF alphaMode=BLEND(解析期读取,OBJ/FBX 恒不透明——
资产格式定义写死);MASK 后续演进。Material 加透明语义(入缓存键),
程序化测试资产 CreateTransparentPlane(RGBA 纯色纹理)。

SceneRenderer:透明材质实例收集进独立 scratch(仅主视图,不投
阴影——alpha 阴影后续演进),batch 按平均距离降序排序(远→近,
batchMats 同步重排),SSBO 扁平化顺序 = 排序后顺序。

ForwardPass 两段绘制:不透明(无混合 + 深度写)→ 透明(Shader
Object 动态状态切 SRC_ALPHA/ONE_MINUS_SRC_ALPHA 线性 over + 深度
只测不写);velocity 附件透明段直写(透明表面 velocity 即自身运动)。
frag alpha = albedo 贴图 a 直通,预乘在 tonemap 段(hard constraint
不变)。已知边界:TAA alpha 时域混合(透明边缘几帧渐显);同 batch
多实例不做实例级排序。
This commit is contained in:
2026-09-25 16:57:27 +08:00
parent 8dbfb9f554
commit b25fa29fe5
16 changed files with 213 additions and 27 deletions
+12
View File
@@ -41,6 +41,18 @@ namespace Engine::Assets {
[&](const std::string&) { return m_Uploader.CreatePlane(halfSize, r, g, b); });
}
ModelRef AssetManager::CreateTransparentPlane(f32 halfSize,
u8 r, u8 g, u8 b, u8 a)
{
std::string key = "procedural://transparent-plane/" +
std::to_string(halfSize) + "/" +
std::to_string(r) + "," + std::to_string(g) + "," +
std::to_string(b) + "," + std::to_string(a);
return m_Models.Load(key, [&](const std::string&) {
return m_Uploader.CreateTransparentPlane(halfSize, r, g, b, a);
});
}
EnvRef AssetManager::LoadEnvironment(const std::string& path)
{
// GPU 生成(compute 预积分)经接口发生在渲染层实现里