
窗口大小调整修复(Iris与Distant Horizons)
修复了使用Iris时,调整窗口大小导致Distant Horizons失效,以及世界深度缓冲不跟随替换的渲染目标的问题。
这是什么
一个修复 Iris 中两个深度缓冲缺陷的小型客户端模组,这两个缺陷都源于同一个问题:Iris 并不拥有世界的深度缓冲,而是借用 Minecraft 的——并且它根据一个无法回答当前问题的计数器来决定何时重新借用。
适用于 Minecraft 1.21.1 / NeoForge 21.1.x。不会对您的世界进行任何写入。
修复 1 — 调整窗口大小后,Distant Horizons 停止渲染
无需渲染缩放模组。这个问题影响纯 Iris + Distant Horizons 组合。
拖动游戏窗口边缘,或切换全屏,Distant Horizons 即停止绘制。这个问题会一直存在,直到您重新加载世界。
原因:当 Iris 调整其渲染目标大小时,它会遍历其拥有的每个帧缓冲,并将 Minecraft 的深度纹理挂载到每个帧缓冲上——而 Distant Horizons 的帧缓冲也在该列表中,尽管它们必须保留 DH 自己的 深度。本应恢复原状的重新连接受限于对纹理 ID 的检查,而 DH 的 ID 从未改变,只有挂载关系变了。因此没有任何东西能恢复它。
本模组在重新连接的开头清除了已记录的 ID,这样 Iris 自身的代码便能正常重新挂载。
修复 2 — 世界的深度不会跟随被替换的渲染目标
如果您使用任何以不同于窗口分辨率渲染世界的工具——渲染缩放器、动态分辨率模组——Iris 最终会以某一尺寸的彩色缓冲绘制,却使用另一尺寸的深度缓冲。Distant Horizons LOD 绘制在一切之上,世界可能会出现拉伸或重影。
从 Iris 编译代码中读取的原因:
// RenderTargets.resizeIfNeeded 和 DHCompatInternal.reconnectDHTextures
if (depthBufferVersion != cachedDepthBufferVersion) { /* 只有在这里才会获取新的深度 */ }
该计数器回答的是 “这个目标是否重新创建了它的缓冲?” 而它无法回答 “现在这是否是一个不同的目标?” —— 而这正是另一个模组将不同的主渲染目标交给 Minecraft 时所发生的情况。
针对此症状通常给出的建议是 “调整游戏窗口大小直到它自行修复”。这之所以有效,正是因为调整大小会让 Minecraft 重新创建其目标,从而使计数器递增。
本模组改为比较深度纹理的 ID 以及 Distant Horizons 纹理的 大小,而不是计数器。在正常游戏中,这每帧仅需一次整数比较。
已验证与未验证的部分
这两个缺陷均直接读取自 Iris 1.8.14 的字节码,且修复 1 已在实机游戏中确认:安装该模组后,日志显示当世界分辨率变化时 DH 深度纹理被重新挂载,且 DH 持续渲染。
尚未进行的是针对上游公开报告中症状与修复 2 匹配的问题进行受控的前后对比测试(RenderScale#59)。机制已被证明;但此处并未声称“这能修复那个问题”。在开发过程中,一个看起来与之完全相同的画面缺陷结果被证明是由完全无关的原因引起的——另一个模组在帧中间泄漏了一个视口。
要求
Minecraft 1.21.1、NeoForge 21.1.x、Iris。Distant Horizons 为可选项——没有它,修复 1 就没有任何可作用的对象。
许可证
MIT。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。