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:
@@ -111,6 +111,20 @@ namespace
|
||||
// 地面:程序化纯色平面(半边长 15,中心 y=-2)
|
||||
const auto ground = GetAssets().CreatePlane(15.0f, 140, 140, 145);
|
||||
|
||||
// 透明管线验证:两片叠放的半透明平面(前后各一,看混合与排序)
|
||||
const auto glass1 = GetAssets().CreateTransparentPlane(
|
||||
2.0f, 80, 180, 255, 110);
|
||||
const auto glass2 = GetAssets().CreateTransparentPlane(
|
||||
2.0f, 255, 120, 80, 110);
|
||||
auto g1 = scene.CreateEntity("GlassNear");
|
||||
g1.AddComponent<MeshRendererComponent>(MeshRendererComponent{glass1});
|
||||
g1.GetComponent<TransformComponent>()
|
||||
.SetPosition(glm::vec3(0.0f, 0.5f, -1.0f));
|
||||
auto g2 = scene.CreateEntity("GlassFar");
|
||||
g2.AddComponent<MeshRendererComponent>(MeshRendererComponent{glass2});
|
||||
g2.GetComponent<TransformComponent>()
|
||||
.SetPosition(glm::vec3(0.0f, 1.0f, -3.0f));
|
||||
|
||||
m_Ground = scene.CreateEntity("Ground");
|
||||
m_Ground.GetComponent<TransformComponent>()
|
||||
.SetPosition(glm::vec3(0.0f, -0.5f, 0.0f)); // dirty → 帧循环统一 Compose
|
||||
|
||||
Reference in New Issue
Block a user