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
相关产品推荐
相关产品推荐

