Minecraft 1.12模组开发TESR的isGlobalRenderer方法失效问题
问题原因
你当前的渲染器实现、isGlobalRenderer重写、注册逻辑均无错误,问题出在Minecraft默认会对TileEntity做视锥体剔除:即使渲染器标记为全局渲染,如果TileEntity本身的渲染包围盒不在玩家视野范围内,整个渲染调用依然会被直接跳过,你漏掉了TileEntity层面的渲染包围盒配置。
解决方案
- 核心修改:重写TileEntity的渲染包围盒方法
在你的TileEntityLightOrbController类中添加如下方法,返回无限大的渲染包围盒即可完全规避视锥体剔除,该实现和原版结构块的逻辑完全一致:
@Override public AxisAlignedBB getRenderBoundingBox() { return INFINITE_EXTENT_AABB; }
可选检查
部分早期1.12版本的Forge存在isGlobalRenderer不生效的已知bug,如果你用的是旧版Forge,可升级到1.12.2最新稳定版Forge(版本号14.23.5.2860)规避这类问题。可选性能优化
如果你的方框渲染范围是可控的,也可以根据存储的所有点位动态计算渲染包围盒,代替无限大包围盒,能小幅提升渲染性能:
@Override public AxisAlignedBB getRenderBoundingBox() { List<PathCheckpoint> checkpoints = getCheckpoints(); if (checkpoints.isEmpty()) { return super.getRenderBoundingBox(); } int minX = getPos().getX(), minY = getPos().getY(), minZ = getPos().getZ(); int maxX = minX, maxY = minY, maxZ = minZ; for (PathCheckpoint checkpoint : checkpoints) { BlockPos pos = checkpoint.getPos(); minX = Math.min(minX, pos.getX()); minY = Math.min(minY, pos.getY()); minZ = Math.min(minZ, pos.getZ()); maxX = Math.max(maxX, pos.getX()); maxY = Math.max(maxY, pos.getY()); maxZ = Math.max(maxZ, pos.getZ()); } return new AxisAlignedBB(minX, minY, minZ, maxX + 1, maxY + 1, maxZ + 1); }
内容的提问来源于stack exchange,提问作者Damia
相关产品推荐
相关产品推荐

