Minecraft 1.18.2 Forge模组自定义维度日月纹理替换求助
Minecraft 1.18.2 Forge 自定义维度太阳/月亮纹理替换实现
实现逻辑不需要复杂的模组开发基础,全程只需要替换代码里的占位符、按路径放好纹理即可,不会影响原版和其他维度的日月显示。
前置准备
- 准备好自定义太阳、月亮纹理:太阳建议尺寸128128px,月亮建议尺寸256128px(按原版格式横向拼接8个月相,单月相尺寸32*32px),格式为带透明通道的PNG。
- 确认你已经注册好自定义维度,记下维度的完整ID,格式为
你的模组id:维度名称,例如mymod:fantasy_realm。
步骤1:放置纹理文件
将做好的纹理放到模组资源目录的对应路径:src/main/resources/assets/你的模组id/textures/environment/
建议命名为custom_sun.png、custom_moon.png,方便后续路径填写。
步骤2:编写渲染监听类
在模组的客户端包路径下新建CustomSkyRenderer.java类,直接复制以下代码,将代码里标注了需要替换的占位符改成你自己的模组信息即可,不需要改动其他渲染参数:
// 替换成你自己模组的实际包路径 package com.yourname.yourmodid.client; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.FogRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; public class CustomSkyRenderer { // --- 以下三个值替换成你自己的内容 --- private static final ResourceLocation CUSTOM_SUN_TEX = new ResourceLocation("你的模组id", "textures/environment/custom_sun.png"); private static final ResourceLocation CUSTOM_MOON_TEX = new ResourceLocation("你的模组id", "textures/environment/custom_moon.png"); private static final ResourceLocation TARGET_DIMENSION = new ResourceLocation("你的模组id", "你的维度名"); // --- 替换结束 --- @SubscribeEvent public void renderCustomCelestialBodies(RenderLevelStageEvent event) { Level currentLevel = Minecraft.getInstance().level; // 非目标维度直接放行,保留原版渲染逻辑 if (currentLevel == null || !currentLevel.dimension().location().equals(TARGET_DIMENSION)) { return; } PoseStack poseStack = event.getPoseStack(); // 仅在天空渲染阶段执行,避免渲染层级错误 if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_SKY) { RenderSystem.depthMask(false); FogRenderer.setupNoFog(); RenderSystem.enableBlend(); // 渲染自定义太阳,位置、尺寸对齐原版参数无需修改 RenderSystem.setShaderTexture(0, CUSTOM_SUN_TEX); poseStack.pushPose(); poseStack.mulPose(event.getModelViewMatrix()); poseStack.translate(-30F, 100F, -30F); poseStack.scale(120F, 120F, 120F); Minecraft.getInstance().gui.blit(poseStack, -15, -15, 0, 0, 30, 30, 30, 30); poseStack.popPose(); // 渲染自定义月亮,自动适配月相 RenderSystem.setShaderTexture(0, CUSTOM_MOON_TEX); int moonPhase = currentLevel.getMoonPhase(); int uOffset = 2 * moonPhase % 8; int vOffset = 2 * (moonPhase / 4); poseStack.pushPose(); poseStack.mulPose(event.getModelViewMatrix()); poseStack.translate(-20F, -100F, 20F); poseStack.scale(90F, 90F, 90F); Minecraft.getInstance().gui.blit(poseStack, -10, -10, uOffset * 10, vOffset * 10, 20, 20, 160, 40); poseStack.popPose(); RenderSystem.disableBlend(); RenderSystem.depthMask(true); } } }
步骤3:注册渲染事件
找到你模组的客户端初始化入口(一般在主类里处理FMLClientSetupEvent事件的位置),添加一行注册代码,注意这行代码必须仅在客户端侧执行,放到服务端逻辑里会直接崩溃:
MinecraftForge.EVENT_BUS.register(CustomSkyRenderer.class);
常见问题排查
- 纹理不显示/显示紫黑块:检查ResourceLocation里的模组id、纹理路径是否和实际文件路径完全一致,注意文件名大小写。
- 日月位置偏移/不随视角转动:不要替换成其他渲染事件,必须使用
RenderLevelStageEvent的AFTER_SKY阶段,不要修改代码里的translate、scale参数。 - 纹理发黑/透明异常:确认纹理是32位带Alpha通道的PNG文件,不要使用JPG、BMP等不支持透明的格式。
- 其他维度的日月也被替换:检查维度ID的判断逻辑是否正确,确认TARGET_DIMENSION的取值和你注册的自定义维度ID完全匹配。
内容的提问来源于stack exchange,提问作者Scripter stuff
相关产品推荐
相关产品推荐

