透明分层屏幕空间折射 + 透明排序修正 + 默认清屏色归零
默认 ClearColor 0.1 → 0(策划阶段结束,无用)。 透明分层折射(玻璃见玻璃):透明段原来单个 ForwardTrans pass,折射 采样源 SceneColor 副本只在不透明段后快照一次(不含任何透明体)→ 前 玻璃折射不出后玻璃。改为按绘制单位远→近拆成至多 kTransparentLayers 层,每层绘制前刷新 SceneColor 副本,使层 L 玻璃采样含所有更远透明体。 RenderGraph pass 编译期定序,故层数固定;超出并入末层。深度 storeOp 改 eStore(多层需 Load 承接有效深度内容)。shader 不改。 透明排序修正:排序键由"相机到实例的欧氏距离"改为视图空间深度 (-(view·p).z)——欧氏距离把侧向偏移计入距离,偏侧物体被误判为更远 (正方体右上的甜甜圈在特定视角被排到后方)。并让透明队列逐实例成批 (不合并):透明本就是每层一个绘制单位,合并成多实例 batch 会让排序 只能用批平均深度、批内实例无法各自定序。零额外 draw 代价。
This commit is contained in:
@@ -268,9 +268,10 @@ void main() {
|
||||
* mix(0.4, 1.0, shade0); // 阴影区环境同步衰减(简化遮蔽)
|
||||
|
||||
// ---- 透射(KHR_materials_transmission):屏幕空间折射 ----
|
||||
// 采样源 = 不透明段快照(天空盒 + 不透明几何,Forward 后
|
||||
// ForwardTrans 前拷贝)。玻璃互相不可见(副本不含透明队列),
|
||||
// 与 UE 屏幕空间透射同一限制。
|
||||
// 采样源 = 场景色副本,每层绘制前逐层刷新(ForwardPass 的分层折射:
|
||||
// 透明队列远→近拆成至多 kTransparentLayers 层,层 L 绘制前把 HDRColor
|
||||
// 拷进副本)。故层 L 玻璃的副本含全部更远透明体——前玻璃能折射出
|
||||
// 后玻璃(玻璃见玻璃),摆脱 UE/Unity 单快照"玻璃互相不可见"的局限。
|
||||
vec3 transmitted = vec3(0.0);
|
||||
if (transmission > 0.0) {
|
||||
// 进入介质 eta = 1/ior;全内反射(TIR)退化为反射方向
|
||||
|
||||
Reference in New Issue
Block a user