Table of Contents

Manipulating a Block's appearance (1.14)

This is the 1.14 version of this tutorial. For the latest version, see Manipulating a Block's appearance.

Making a block transparent

You may have noticed that even if your block's texture is transparent, it still looks opaque. To fix this, override getRenderLayer and return BlockRenderLayer.TRANSLUCENT:

class MyBlock extends Block {
    @Environment(EnvType.CLIENT)
    @Override
    public BlockRenderLayer getRenderLayer() {
        return BlockRenderLayer.TRANSLUCENT;
    }
 
    [...]
}

You probably also want to make your block transparent. To do that, use the Material constructor to set blocksLight to false.

class MyBlock extends Block {
     private static final Material MY_MATERIAL = new Material(
            MaterialColor.AIR, // materialColor,
            false, // isLiquid,
            false, // isSolid,
            true, // blocksMovement,
            false, // blocksLight,  <----- Important part, the other parts change as you wish
            true, // !requiresTool,
            false, // burnable,
            false, // replaceable,
            PistonBehavior.NORMAL // pistonBehavior
    );
 
    public MyBlock() {
        super(Settings.of(MY_MATERIAL));
    }
 
    [...]
}

Making a block invisible

First we need to make the block appear invisible. To do this we override getRenderType in our block class and return BlockRenderType.INVISIBLE:

    @Override
    public BlockRenderType getRenderType(BlockState blockState) {
        return BlockRenderType.INVISIBLE;
    }

We then need to make our block unselectable by making its outline shape be non-existent. So override getOutlineShape and return an empty VoxelShape:

    @Override
    public VoxelShape getOutlineShape(BlockState blockState, BlockView blockView, BlockPos blockPos, EntityContext entityContext) {
       return VoxelShapes.empty;
    }