跳到正文

Window Resize Fix (Iris & Distant Horizons)

作者:mzg

修复 Iris 中调整窗口大小后 Distant Horizons 出现故障,以及世界深度缓冲区未跟随替换后的渲染目标的问题。

收藏

介绍

介绍由机器翻译自 CurseForge 原页面,仅供参考。

这是什么

一个小型客户端模组,可修复 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    and    DHCompatInternal.reconnectDHTextures
if (depthBufferVersion != cachedDepthBufferVersion) { /* only here is a new depth taken */ }

该计数器能回答“此渲染目标是否重新创建了缓冲区?”却无法回答“现在是不是换成了另一个渲染目标?”——而这恰恰就是另一个模组向 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。

常见问题

Window Resize Fix (Iris & Distant Horizons) 支持哪些 Minecraft 版本?

Window Resize Fix (Iris & Distant Horizons) 支持 Minecraft Java 版 1.20.1–26.3,共 23 个版本,可用的加载器:Fabric / NeoForge。下载时注意选择和你游戏版本一致的文件。

Window Resize Fix (Iris & Distant Horizons) 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 Fabric / NeoForge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。

评论

登录后评论和评分

mzg 的其他作品

查看全部 →