You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Forge 1.20.1:如何渲染仅带纹理可穿透的假方块?

解决renderSingleBlock参数传入与假方块纹理实现问题

一、renderSingleBlock各参数传入说明

直接拆解每个参数的取值逻辑:

  • blockstate:用内置方块纹理时,直接调用目标方块的默认状态,比如Blocks.STONE.defaultBlockState();自定义纹理则需要创建并注册一个虚拟Block(可设置无碰撞属性),取其默认BlockState来绑定自定义模型纹理。
  • posStack:直接传入渲染上下文里的PoseStack实例,比如在RenderLevelStageEvent或自定义渲染类中获取的对象。
  • bufferSource:使用Minecraft.getInstance().renderBuffers().bufferSource()获取全局渲染缓冲源即可。
  • packedLight:穿透方块想要不受环境光照影响,直接传LightTexture.FULL_BRIGHT(值为0xF000F0);若要贴合场景光照,用LevelRenderer.getLightColor(level, pos)获取对应坐标的光照值。
  • packedOverlay:穿透方块不需要叠加层,传OverlayTexture.NO_OVERLAY(值为0)。
  • modelData:无特殊模型属性需求时传ModelData.EMPTY;自定义模型需额外属性(比如朝向)时,创建ModelData并添加对应属性即可。
  • renderType:实现穿透效果用RenderType.translucent()或RenderType.cutout();用内置方块的渲染逻辑则直接取blockstate.getRenderType();自定义纹理可注册专属RenderType,通过RenderType.create()指定纹理路径。

二、内置/自定义纹理实现方案

1. 内置方块纹理示例

直接复用现有方块的纹理和渲染逻辑:

BlockState fakeBlockState = Blocks.GLASS.defaultBlockState(); // 玻璃自带穿透效果纹理
Minecraft.getInstance().getBlockRenderer().renderSingleBlock(
    fakeBlockState,
    poseStack,
    Minecraft.getInstance().renderBuffers().bufferSource(),
    LightTexture.FULL_BRIGHT,
    OverlayTexture.NO_OVERLAY,
    ModelData.EMPTY,
    fakeBlockState.getRenderType()
);

2. 自定义纹理实现步骤

  • 第一步:在资源包assets/你的modid/models/block下创建模型文件,比如fake_block.json,指定自定义纹理路径:
{
  "parent": "block/cube_all",
  "textures": {
    "all": "你的modid:block/custom_fake_texture"
  }
}
  • 第二步:代码中调用自定义Block的状态进行渲染:
BlockState customFakeState = YourModRegistry.FAKE_PENETRABLE_BLOCK.get().defaultBlockState();
Minecraft.getInstance().getBlockRenderer().renderSingleBlock(
    customFakeState,
    poseStack,
    Minecraft.getInstance().renderBuffers().bufferSource(),
    LightTexture.FULL_BRIGHT,
    OverlayTexture.NO_OVERLAY,
    ModelData.EMPTY,
    RenderType.translucent()
);

3. 动态切换纹理逻辑

如果需要在运行时切换内置/自定义纹理,加个判断即可:

BlockState targetState;
RenderType targetRenderType;
if (enableCustomTexture) {
    targetState = YourModRegistry.FAKE_PENETRABLE_BLOCK.get().defaultBlockState();
    targetRenderType = RenderType.translucent();
} else {
    targetState = Blocks.PRISMARINE.defaultBlockState();
    targetRenderType = targetState.getRenderType();
}

Minecraft.getInstance().getBlockRenderer().renderSingleBlock(
    targetState,
    poseStack,
    Minecraft.getInstance().renderBuffers().bufferSource(),
    LightTexture.FULL_BRIGHT,
    OverlayTexture.NO_OVERLAY,
    ModelData.EMPTY,
    targetRenderType
);

内容的提问来源于stack exchange,提问作者BaRiboD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:53:30