При попытке рендера получается черная модель

Версия Minecraft
1.12.2
API
Forge
Привет. Пытаюсь написать рендер чего-то на блоке с TileEntity. Но возникла проблема, при попытке рендера модель рендерится, но при этом не отображается ни текстура ни цвет. Рендерить пробовал различными способами. И через vao\vbo и через Tessellator и даже пытался скопировать из ванилы класс рендера эндер сундука. Все рендерится одинаково - модель есть, но черного цвета.
Может кто-то сможет подсказать, что я делаю не так? Если тема дубликат прошу простить, я искал на форме TileEntitySpecialRenderer и еще много всего, но не заметил такой проблемы еще у кого-то.

SimpleRender:
//Копия ванильного класса TileEntityEnderChestRenderer

public class SimpleRender extends TileEntitySpecialRenderer<TestTileEntity> {
    private static final ResourceLocation ENDER_CHEST_TEXTURE = new ResourceLocation("textures/entity/chest/ender.png");
    private final ModelChest modelChest = new ModelChest();

    @Override
    public void render(TestrTileEntity te, double x, double y, double z, float partialTicks, int destroyStage, float alpha) {
        int i = 0;

        if (te.hasWorld())
        {
            i = te.getBlockMetadata();
        }

        if (destroyStage >= 0)
        {
            this.bindTexture(DESTROY_STAGES[destroyStage]);
            GlStateManager.matrixMode(5890);
            GlStateManager.pushMatrix();
            GlStateManager.scale(4.0F, 4.0F, 1.0F);
            GlStateManager.translate(0.0625F, 0.0625F, 0.0625F);
            GlStateManager.matrixMode(5888);
        }
        else
        {
            this.bindTexture(ENDER_CHEST_TEXTURE);
        }

        GlStateManager.pushMatrix();
        GlStateManager.enableRescaleNormal();
        GlStateManager.color(1.0F, 1.0F, 1.0F, alpha);
        GlStateManager.translate((float)x, (float)y + 1.0F, (float)z + 1.0F);
        GlStateManager.scale(1.0F, -1.0F, -1.0F);
        GlStateManager.translate(0.5F, 0.5F, 0.5F);
        int j = 0;

        if (i == 2)
        {
            j = 180;
        }

        if (i == 3)
        {
            j = 0;
        }

        if (i == 4)
        {
            j = 90;
        }

        if (i == 5)
        {
            j = -90;
        }

        GlStateManager.rotate((float)j, 0.0F, 1.0F, 0.0F);
        GlStateManager.translate(-0.5F, -0.5F, -0.5F);
        float f = 1.0F;
        this.modelChest.chestLid.rotateAngleX = -(f * ((float)Math.PI / 2F));
        this.modelChest.renderAll();
        GlStateManager.disableRescaleNormal();
        GlStateManager.popMatrix();
        GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);

        if (destroyStage >= 0)
        {
            GlStateManager.matrixMode(5890);
            GlStateManager.popMatrix();
            GlStateManager.matrixMode(5888);
        }
    }
}

Java:
public class BlockTest extends BlockTileEntity<TestTileEntity> {
    public BlockTest(String name, Material material, float hardness, float resistanse, SoundType soundType) {
        super(name, material, hardness, resistanse, soundType);
    }

    @Override
    public boolean onBlockActivated(World world, BlockPos position, IBlockState blockState, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) {

        if (CommonProxy.isServer(world)) {
            TestTileEntity tileEntity = getTileEntity(world, position);

            if (side == EnumFacing.DOWN) {
                tileEntity.decrementCount();
            }
            else if (side == EnumFacing.UP) {
                tileEntity.incrementCount();
            }
            player.sendMessage(new TextComponentString("Count: " + tileEntity.getCount()));
        }
        return true;
    }

    @Override
    public Class<TestTileEntity> getTileEntityClass() {
        return TestTileEntity.class;
    }

    @Nullable
    @Override
    public TestTileEntity createTileEntity(World world, IBlockState blockState) {
        return new TestTileEntity();
    }
}
TestTileEntity:
public class TestTileEntity extends TileEntity {
    private int count;

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound tagCompound) {

        tagCompound.setInteger("count", this.count);
        return super.writeToNBT(tagCompound);
    }

    @Override
    public void readFromNBT(NBTTagCompound tagCompound) {

        this.count = tagCompound.getInteger("count");
        super.readFromNBT(tagCompound);
    }

    @Override
    public NBTTagCompound getUpdateTag() {
        return this.writeToNBT(new NBTTagCompound());
    }

    @Nullable
    @Override
    public SPacketUpdateTileEntity getUpdatePacket() {
        return new SPacketUpdateTileEntity(this.pos, this.getBlockMetadata(), this.getUpdateTag());
    }

    @Override
    public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity packet) {
        super.onDataPacket(net, packet);
        this.handleUpdateTag(packet.getNbtCompound());
    }

    public int getCount() {
        return this.count;
    }

    public void incrementCount() {

        this.count++;
        this.markDirty();
    }

    public void decrementCount() {

        this.count--;
        this.markDirty();
    }
}

ClientProxy:
//Тут в bindTileEntitySpecialRenderer регистрирую рендер

public class ClientProxy extends CommonProxy {
    @Override
    public void preInit(FMLPreInitializationEvent event) {
        super.preInit(event);
    }

    @Override
    public void init(FMLInitializationEvent event) {
        super.init(event);
        BlockRegister.registerRender();
        ClientRegistry.bindTileEntitySpecialRenderer(TestTileEntity.class, new SimpleRender());
    }

    @Override
    public void postInit(FMLPostInitializationEvent event)
    {
        super.postInit(event);
    }
}
Вот как оно выглядит.
PS: Через отладчик id текстуры 37 или вроде того, то есть не 0 и текстуру оно видит, хотя не уверен, что это важно.
 
Последнее редактирование:
Такое обычно получается когда у тебя блок не полый (т.е. твёрдый). Смотри стекло, листву и т.д.
Добавил
Java:
@Override
public boolean isFullCube(IBlockState state)  { return false;  }

@Override
public boolean isOpaqueCube(IBlockState state) { return false; }

Кажется работает, большое спасибо.
Но интересно, а как вообще так происходит, что майнкрафт такого делает перед отрисовкой, что оно стает черным? При том без майна код который я пробовал все нормально рисует.
 
Заполняет лайтмапу. А так как твой блок считался полным, то сила света на данных координатах 0, соответственно красится модель в чёрный полностью.
А, кажется относительно понял. Спасибо.
 
Сверху