render/(云 / 全景 / 天气 / 选框 / 自发光贴图)
基本信息
| 属性 |
值 |
| 目录 |
com.gtnewhorizons.angelica.render |
| 文件数 |
16(全部单层) |
| 总行数 |
4424 |
| 性质 |
包可见性混合:4 个 public,11 个包私有 final class |
它解决什么问题
Angelica 把原版 1.7.10 的五套渲染路径换成了 GPU 驱动版本:云的体素化网格、全景图的模糊后处理、雨雪的 GPU 实例化、方块选框的着色器描边、以及自发光贴图的自动登记。全部依赖 GLSM 的状态跟踪与 core profile 兼容层。
16 个文件全清单(集合运算)
A. 云渲染(10 个,3247 行)
| # |
文件 |
行数 |
可见性 |
角色 |
| 1 |
CloudVertexMesh.java |
971 |
包私有 final |
云的顶点网格构建与 VAO 维护(本子系统最大) |
| 2 |
CloudLayerRenderer.java |
713 |
包私有 final |
单个云层的绘制。文件头为 Forge 1.12 LGPL 2.1 回移 |
| 3 |
CloudFaceMesh.java |
325 |
包私有 final |
面的网格与 GL buffer 维护 |
| 4 |
CloudRenderer.java |
220 |
public |
云渲染总控,实现 IResourceManagerReloadListener。同为 Forge 1.12 LGPL 回移 |
| 5 |
CloudShape.java |
193 |
包私有 final |
读 clouds.png、判云格、贪心矩形合并为「板」、边缘合并为墙 |
| 6 |
CloudPlateCover.java |
179 |
包私有 final |
落入圆盘内的「板」矩形 |
| 7 |
CloudDisc.java |
139 |
包私有 final |
圆盘形状、楔形切分、几何构建阈值 |
| 8 |
CloudRenderResources.java |
118 |
包私有 final |
GL program / shader / 纹理资源 |
| 9 |
CloudUniforms.java |
112 |
包私有 final |
两个云 program 共用的 uniform 句柄 |
| 10 |
CloudView.java |
77 |
包私有 final |
每帧的相机朝向/偏移/pixelsPerRadian 推导 |
B. 全景图(1 个)
| # |
文件 |
行数 |
可见性 |
角色 |
| 11 |
PanoramaRenderer.java |
346 |
public |
菜单全景图的模糊着色器后处理 |
C. 天气(2 个)
| # |
文件 |
行数 |
可见性 |
角色 |
| 12 |
WeatherRenderer.java |
528 |
public |
雨雪的 GPU 实例化渲染 |
| 13 |
WeatherColumns.java |
213 |
public |
逐列雨雪数据采样缓存(WeakReference<WorldClient>) |
D. 方块选框(1 个)
| # |
文件 |
行数 |
可见性 |
角色 |
| 14 |
SelectionBoxRenderer.java |
157 |
public final |
选框的着色器描边 |
E. 自发光贴图(2 个)
| # |
文件 |
行数 |
可见性 |
角色 |
| 15 |
EmissiveTextureAutoloader.java |
79 |
public |
监听 TextureStitchEvent 自动登记自发光贴图 |
| 16 |
EmissiveTextureHelper.java |
54 |
public final |
@SideOnly(CLIENT),自发光判定与缓存 |
关键常量(源码实值)
| 常量 |
值 |
位置 |
CloudDisc.CELLS_PER_CHUNK |
8 |
CloudDisc.java:6 |
CloudDisc.MARGIN_CELLS |
16 |
CloudDisc.java:7 |
CloudDisc.WEDGE_COUNT |
32 |
CloudDisc.java:8 |
CloudDisc.WEDGES_PER_RADIAN |
WEDGE_COUNT / (2.0 * Math.PI) |
CloudDisc.java:9 |
CloudUniforms.ALPHA |
0.8f |
CloudUniforms.java:6 |
CloudShape.OPAQUE |
1 << 4 |
CloudShape.java:6 |
CloudShape.WEST_EMPTY |
1 |
CloudShape.java:7 |
CloudShape.EAST_EMPTY |
1 << 1 |
CloudShape.java:8 |
CloudShape.NORTH_EMPTY |
1 << 2 |
CloudShape.java:9 |
CloudShape 用位掩码记录每格的 4 面暴露情况:第 0~3 位分别是 WEST/EAST/NORTH/SOUTH_EMPTY,第 4 位(1 << 4)是 OPAQUE。
配置门控
| 配置字段 |
默认 |
影响的文件 |
行 |
AngelicaConfig.enableVBOClouds |
见配置文件 |
CloudRenderer、CloudLayerRenderer 等 A 组 |
AngelicaConfig.java:64 |
AngelicaConfig.enablePanoramaBlurShader |
见配置文件 |
PanoramaRenderer |
AngelicaConfig.java:59 |
AngelicaConfig.enableInstancedWeather |
见配置文件 |
WeatherRenderer、WeatherColumns |
AngelicaConfig.java:68 |
enableDynamicLights 门控 WeatherColumns 之外的部分:Weather 渲染会与动态光源交互(见下)。
入口点(引用点集合运算)
| 类 |
引用位置 |
说明 |
CloudRenderer |
ClientProxy.java:66(import) |
资源重载监听器注册 |
EmissiveTextureAutoloader |
ClientProxy.java:139 MinecraftForge.EVENT_BUS.register(new EmissiveTextureAutoloader()) |
唯一确认的显式实例化点 |
WeatherRenderer |
CeleritasWorldRenderer.java:55(import) |
由世界渲染器驱动 |
PanoramaRenderer |
无实例化点 |
— |
SelectionBoxRenderer |
无实例化点 |
— |
PanoramaRenderer 与 SelectionBoxRenderer 在主源码树内找不到 new 调用点,可能由 mixin 直接调用静态方法或在本仓库外被驱动 —— 本仓库不可判定。
上游依赖(关键:并非全是 Angelica 自己的代码)
| 上游 |
被哪些文件 import |
说明 |
| Forge 1.12(LGPL 2.1 回移) |
CloudRenderer.java:1-13、CloudLayerRenderer.java:1-13 |
两个文件头部是完整的 Forge 1.12 LGPL 2.1 版权声明,注明「Backported from Minecraft Forge 1.12」 |
Sodium / Embeddium 派生(org.embeddedt.embeddium.impl.*) |
CloudRenderResources、CloudUniforms、PanoramaRenderer、SelectionBoxRenderer |
GL program/shader/uniform 基础设施 |
Iris(net.irisshaders.iris.api.v0.IrisApi) |
SelectionBoxRenderer |
着色器存在性判定 |
NotFine(jss.notfine.core.SettingsManager) |
WeatherRenderer |
天气设置读取 |
| DragonAPI 兼容层 |
WeatherRenderer |
compat.dragonapi.DragonAPICompat |
| GLSM(本 mod 子项目) |
几乎全部 |
GLStateManager、Tracy、FFP instancing/VAO |
| gtnhlib |
CloudVertexMesh |
MemoryUtilities、IVertexArrayObject、DefaultVertexFormat |
这是幻觉高发区:本目录 16 个文件里,只有 WeatherColumns、EmissiveTextureHelper、SelectionBoxRenderer 等少数是 Angelica 原创;CloudRenderer 与 CloudLayerRenderer 是 Forge 1.12 的 LGPL 回移代码,不是 Angelica 自己的实现。
已知问题
PanoramaRenderer / SelectionBoxRenderer 入口不可判定(见上):无法从本仓库确认它们的生命周期。
- 两个云文件是第三方回移代码:
CloudRenderer 与 CloudLayerRenderer 上游是 Forge 1.12 的云渲染器。1.7.10 的 IWorldProvider.getCloudHeight 语义与 1.12 不同,回移时必然有适配改动,但文件内没有标注哪些行是 Angelica 自己加的(只有整体版权头)。审阅时无法区分。
- 对外 API 泄漏上游包名:
org.embeddedt.embeddium.impl.* 出现在 4 个文件里(见 API 层 同类问题)。
CloudShape 的位掩码只定义了 4 个常量:定义了 WEST/EAST/NORTH_EMPTY 与 OPAQUE,但 CloudShape.java:9 之后(SOUTH_EMPTY)在本轮读取范围内未确认;CloudShape.java:10 起还有更多常量。位掩码布局依赖常量定义顺序,缺一项就会改变语义。
- 11/16 是包私有
final class:外部 mod 无法直接复用云/天气/选框的内部实现。若要扩展只能走 api/(目前 api/clouds/ 只有 2 个文件)。
WeatherRenderer 依赖 3 个不同子系统:GLSM FFP(instancing/VAO)、NotFine 设置、DragonAPI 兼容层,外加 AngelicaConfig 与 SystemProperties。是全目录耦合最重的文件。
相关条目