Skip to content

Commit 6110854

Browse files
authored
fix(terrain): restore translucent depth-mask semantics for pass-1 TESR fluids (#111)
da83c59 (#85) flipped the translucent terrain pass to writesDepth(true) on the incorrect premise that vanilla keeps the depth mask on for translucent terrain. Vanilla 1.12.2 wraps the whole translucent stage (translucent terrain plus the pass-1 tile-entity re-render) in depthMask(false) (EntityRenderer ~L1539/1564), so writing depth there makes translucent terrain such as EnderIO tank glass occlude the tank fluid TESR drawn afterwards — the fluid vanished on both the fixed-function and shader paths (#58 recurrence). - VintageRenderPassConfigurationBuilder: translucent pass back to writesDepth(false); water pass keeps writesDepth(true) - IrisCeleritasChunkShaderInterface: translucent-semantic passes never write depth on the main pass (shadow pass and opaque semantics unchanged) - TerrainRenderPassTest: mirror the real builder configuration for the depth write policy
1 parent 0ed51a2 commit 6110854

4 files changed

Lines changed: 42 additions & 9 deletions

File tree

docs/compatibility-matrix.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ Windows 10、NVIDIA GeForce RTX 5070 Laptop GPU(驱动 610.74)。
4343
> 无条件强制 `glDepthMask(true)`,translucent 层里的罐体玻璃窗因此写出深度,遮挡了其后绘制的
4444
> TESR 液体;修复后 translucent terrain pass 在主 pass 不再写深度(与 vanilla 语义一致),
4545
> 阴影图 pass 与不透明 pass 保持写深度。
46+
>
47+
> 2026-09-02 追加:上述修复曾被 #85`da83c59`)回潮——该提交把 translucent terrain pass
48+
> 翻转为写深度,依据的"vanilla 半透明阶段保持写深度"前提不实:vanilla 1.12.2 将整个
49+
> translucent 阶段(半透明地形 + pass-1 方块实体重绘)包在 `depthMask(false)`
50+
> `EntityRenderer` 约 1539/1564 行),储罐玻璃先写深度便遮挡了其后渲染的流体 TESR,
51+
> 有无光影均不显示。修复为 translucent pass 恢复不写深度
52+
> `VintageRenderPassConfigurationBuilder`),水 pass 保持写深度;光影路径由
53+
> Iris celeritas 接口对 translucent 语义 pass 统一不写深度兜底。无光影/光影双路径、
54+
> 水与玻璃叠层、mipmap 切换均回归通过。
4655
>
4756
> 2026-08-18 追加:Snow! Real Magic! 0.7.4(issue #35)带雪栅栏不渲染的修复——见下方
4857
> [模组与环境](#模组与环境) 的 Snow! Real Magic! 行。根因是 SRM 把被雪覆盖的方块替换为携带
@@ -94,7 +103,7 @@ Windows 10、NVIDIA GeForce RTX 5070 Laptop GPU(驱动 610.74)。
94103
| VoxelMap | 部分 | 条件 Mixin(CPU 纹理路径 + 线性过滤 + scissor 重路由 + HudCaching alpha 保护) | 1.9.25 小地图黑屏/黑块已修复(dev 验证圆内正常显示地图内容、HUD 不被缓存隐藏,见 [docs/compat/voxelmap.md](compat/voxelmap.md));已知缺口:与 StellarCore `HudCaching` 组合时小地图圆周仍可能残留黑块(VoxelMap 全屏清 alpha + DST_ALPHA 混合与 HUD 缓存 FBO 的第三方冲突,`HudCaching=false` 即消失,非本模组缺陷);验证 VoxelMap 需停用 JourneyMap(二者频道冲突) |
95104
| ModernUI | 代码支持 | GUI scale hook | 尚缺当前运行时验证记录 |
96105
| Depths Update | 已验证 | 兼容门控(`compat/depthsupdate`:公开 API 推导 section 范围 + storage 索引映射) | 1.0.0-a10:扩展世界高度(默认 -64..320)下 Y<0 与 Y>255 的方块不再缺失(渲染器原先硬编码 0-255);dev 实测正常;无 Depths 时回退 vanilla 行为 |
97-
| EnderIO CEu / EnderCore CEu | 已验证 | 无(核心渲染语义修复,非模组接入) | 5.4.2 + EnderCore 0.5.81:光影开启时流体罐内液体被罐体玻璃窗深度遮挡的问题已修复(`cb4feaa5`,translucent terrain pass 不再写深度);MakeUp Ultra Fast 9.4c + Cleanroom 0.5.17-alpha 实测通过 |
106+
| EnderIO CEu / EnderCore CEu | 已验证 | 无(核心渲染语义修复,非模组接入) | 5.4.2 + EnderCore 0.5.81:光影开启时流体罐内液体被罐体玻璃窗深度遮挡的问题已修复(`cb4feaa5`,translucent terrain pass 不再写深度);MakeUp Ultra Fast 9.4c + Cleanroom 0.5.17-alpha 实测通过;2026-09-02 修复 #85`da83c59`)引入的回潮——translucent pass 被错误翻转为写深度导致有无光影流体均被玻璃遮挡,已恢复 vanilla 深度语义,双路径实测通过 |
98107
| Snow! Real Magic! | 已验证 | 兼容门控(SRM 的 snow_layer 块退回 vanilla dispatcher 路径) | 0.7.4:带雪栅栏不渲染已修复(SRM 把被覆盖方块替换为带 SnowTile 的雪层、仅在 `BlockRendererDispatcher.renderBlock` 内重绘,快速区块路径已绕过);`6aee395`,dev 运行验证通过(MakeUp Ultra Fast 下无光影 + 光影各验一次) |
99108
| TC4 Research Port: Reborn | 部分 | 条件 Mixin(Old Research Tessellator 转发到 streaming drawer) | 1.0.1-release(1632015:8642028):已修复 splash 结束后 repack capacity 为 0 导致的 GUI Client thread 无限循环;dev 人工回归确认研究笔记 GUI 不再卡死,优化后约 500+ FPS,与背包界面同量级;研究树视觉回归待补,详见 [docs/compat/oldresearch.md](compat/oldresearch.md) |
100109
| Modern Splash | 部分 | 无侵入(替换类与 mixin 注入天然兼容)+ splash 字体 color=0 修复 | 1.5.3(629058:8487408)dev 运行通过(coremod 加载、mixin 注入保留、字体颜色按配置生效);光影场景回归待做,详见 [docs/compat/modern-splash.md](compat/modern-splash.md) |

shader/src/main/java/net/coderbot/iris/celeritas/IrisCeleritasChunkShaderInterface.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,13 @@ public void setupState(TerrainRenderPass pass) {
159159
}
160160

161161
public static boolean shouldWriteDepth(TerrainRenderPass pass, boolean shadowPass) {
162-
return shadowPass || pass.writesDepth();
162+
// The main translucent pass must never write depth: under shaders, block entities render
163+
// after translucent terrain, so glass windows (EnderIO fluid tanks, issue #58) writing
164+
// depth would occlude the TESR fluid behind them. The pass's writesDepth flag carries the
165+
// shaderless (fixed-function) policy, where vanilla keeps the mask on and TESRs draw first;
166+
// the Iris path therefore applies the per-semantic override itself instead of deferring to
167+
// the flag. Water keeps writing depth so stacked water sorts correctly (#79).
168+
return shadowPass || (pass.writesDepth() && pass.semantic() != TerrainRenderPass.Semantic.TRANSLUCENT);
163169
}
164170

165171
@Override

src/main/java/com/dhj/actinium/render/terrain/VintageRenderPassConfigurationBuilder.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,14 @@ public static RenderPassConfiguration<BlockRenderLayer> build(ChunkVertexType ve
8787
.fragmentDiscard(false)
8888
.useReverseOrder(true)
8989
.semantic(TerrainRenderPass.Semantic.TRANSLUCENT)
90-
.writesDepth(true)
90+
// Vanilla 1.12.2 wraps the whole translucent stage (terrain plus the pass-1
91+
// tile-entity re-render such as EnderIO tank fluid) in depthMask(false), see
92+
// EntityRenderer around lines 1539/1564. Writing depth here makes translucent
93+
// terrain (e.g. the tank glass) occlude pass-1 TESR geometry drawn afterwards,
94+
// which hid EnderIO tank fluid on both the fixed-function and shader paths (#58).
95+
// The earlier flip to true (64b9c32/da83c59) rested on the incorrect premise
96+
// that vanilla keeps the depth mask on for translucent terrain.
97+
.writesDepth(false)
9198
.useTranslucencySorting(ActiniumRuntime.options().performance.useTranslucentFaceSorting)
9299
.build();
93100

src/test/java/org/embeddedt/embeddium/impl/render/chunk/terrain/TerrainRenderPassTest.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -142,19 +142,30 @@ private static Stream<Arguments> shadowPassSemantics() {
142142
);
143143
}
144144

145-
@ParameterizedTest(name = "{0} shadow={1} writes depth={2}")
145+
@ParameterizedTest(name = "{0} shadow={3} writes depth={4}")
146146
@MethodSource("depthWritePolicies")
147-
void appliesDepthWritePolicy(String name, boolean shadowPass, boolean expected) {
148-
TerrainRenderPass pass = pass(name, expected, shadowPass, false);
147+
void appliesDepthWritePolicy(
148+
String name,
149+
TerrainRenderPass.Semantic semantic,
150+
boolean reverseOrder,
151+
boolean writesDepth,
152+
boolean shadowPass,
153+
boolean expected
154+
) {
155+
TerrainRenderPass pass = pass(name, writesDepth, reverseOrder, false, semantic);
149156

150157
assertEquals(expected, IrisCeleritasChunkShaderInterface.shouldWriteDepth(pass, shadowPass));
151158
}
152159

153160
private static Stream<Arguments> depthWritePolicies() {
154161
return Stream.of(
155-
Arguments.of("translucent", false, false),
156-
Arguments.of("water", false, true),
157-
Arguments.of("shadow translucent", true, true)
162+
// Mirror VintageRenderPassConfigurationBuilder: the translucent pass carries the
163+
// fixed-function depth policy (writesDepth=true), and the Iris main pass must still
164+
// suppress depth writes so TESR fluids behind glass stay visible (#58).
165+
Arguments.of("translucent", TerrainRenderPass.Semantic.TRANSLUCENT, true, true, false, false),
166+
Arguments.of("water", TerrainRenderPass.Semantic.WATER, true, true, false, true),
167+
Arguments.of("solid", TerrainRenderPass.Semantic.SOLID, false, true, false, true),
168+
Arguments.of("shadow translucent", TerrainRenderPass.Semantic.TRANSLUCENT, true, true, true, true)
158169
);
159170
}
160171

0 commit comments

Comments
 (0)