Повторное рисование сцены

Версия Minecraft
1.7.10
Всем привет.
Пытался я тут сделать что-то вроде зеркал (отражений в них), для этого нужно каким-то образом повторно зарендерить мир в другой определенной точке(на координатах зеркала).
Нашел метод renderWorld в Minecraft.getMinecraft().entityRenderer.
Получилось что-то типа этого:
Java:
 public static Framebuffer framebuffer;
    @SubscribeEvent
    public void onTick(TickEvent.RenderTickEvent event){
        if(!event.phase.equals(TickEvent.Phase.END))
            return;
        if(rendering) return;
        if(framebuffer == null) framebuffer = GLMC10.glGetSimilarMcFBO(true);
        GLMC10.glCopyOptionsMcFBO(framebuffer);

        GL11.glEnable(GL11.GL_BLEND);
        Minecraft mc = Minecraft.getMinecraft();

        GameSettings settings = mc.gameSettings;
        EntityLivingBase entityLast = mc.renderViewEntity;
        boolean hideGuiLast = settings.hideGUI;
        float fovLast = settings.fovSetting;
        int widthLast = mc.displayWidth;
        int heightLast = mc.displayHeight;

        for(Reflection reflection : reflections) {
            if(reflection.getEntityCamera() == null) continue;
            mc.renderViewEntity = reflection.getEntityCamera();
            settings.fovSetting = 90f;
            settings.hideGUI = true;

            rendering = true;
            EntityRenderer entityRenderer = mc.entityRenderer;
            entityRenderer.renderWorld(1f, reflection.getRenderEndNanoTime() + (1000000000 / settings.limitFramerate));
            reflection.setTextureReflection(framebuffer.framebufferTexture);
            reflection.setRenderEndNanoTime(System.nanoTime());
            rendering = false;
        }

        mc.renderViewEntity = entityLast;
        settings.fovSetting = fovLast;
        settings.hideGUI = hideGuiLast;
        mc.displayWidth = widthLast;
        mc.displayHeight = heightLast;
        GL11.glDisable(GL11.GL_BLEND);

        Minecraft.getMinecraft().framebufferMc.bindFramebuffer(true);

        GL10.glViewportz(widthLast, heightLast);
        GL11.glLoadIdentity();
    }
Ну и потом я просто накладываю текстурку фбо на предмет.
1543077297786.png
И это вроде бы работает, но если немного отлететь от "зеркала", то чанки перестают прогружаться
1543077624346.png
1543077761955.png
Как и на зеркале, так и в нормальном мире.
Как я понял, чанки рисуются только на заданном растоянии(renderDistanceChunks) от renderViewEntity, и перестают прогружаться на растоянии(renderDistanceChunks) от игрока. Почему так? Можно ли это как-то исправить?
Еще кстати, что странно счетчик чанков показывает что апдейтится очень-очень много чанков
1543077986775.png
Но если в стоять в том же чанке что и камера, то счетчик уже показывает обычные значения(0 если никакие из чанков не изменяются):
1543078099931.png
Это очень странно
 
Решение
вызов renderWorld явно как-то портит загрузку чанков
Он не портит, а вызывает ее. Получается, что ты вызываешь апдейт чанков для своих рефлекшенов со своими позициями, а потом для игрока.
Попробуй написать свой метод renderWorld без апдейта чанков либо вставить хук в апдейт чанков с проверкой на твою глобал переменную.
2,505
81
397
Как я понял, чанки рисуются только на заданном растоянии(renderDistanceChunks) от renderViewEntity, и перестают прогружаться на растоянии(renderDistanceChunks) от игрока. Почему так? Можно ли это как-то исправить?
Потому что выполняется frustum culling от камеры игрока. Поверни камеру.
 
2,505
81
397
А, ок. Я сам протупил. Невнимательно все прочитал. И не заметил mc.renderViewEntity = reflection.getEntityCamera();.
Сложно сказать. Если ты меняешь позицию камеры, то там что угодно может пойти не так. Попробуй меня только направление для теста.
 
Хм, так вроде работает 1543085108063.png
1543085161698.png
Java:
for(Reflection reflection : reflections) {
    if(reflection.getEntityCamera() == null) continue;
    settings.fovSetting = 90f;
    mc.renderViewEntity.rotationYaw=90; //<-
    settings.hideGUI = true;
    rendering = true;
    EntityRenderer entityRenderer = mc.entityRenderer;

    entityRenderer.renderWorld(1f, 1000000000 / settings.limitFramerate);
    reflection.setTextureReflection(framebuffer.framebufferTexture);
    reflection.setRenderEndNanoTime(System.nanoTime());
    rendering = false;
}
 
Хм, забавно. вызов renderWorld явно как-то портит загрузку чанков.
1543087591643.png
Java:
for(Reflection reflection : reflections) {
    if(reflection.getEntityCamera() == null) continue;
    mc.renderViewEntity.posX = 1;
    mc.renderViewEntity.posY = 5;
    mc.renderViewEntity.posZ = 1;
    settings.fovSetting = 90f;
    settings.hideGUI = true;
    rendering = true;
    EntityRenderer entityRenderer = mc.entityRenderer;
    entityRenderer.renderWorld(1f, 1000000000 / settings.limitFramerate);
    reflection.setTextureReflection(framebuffer.framebufferTexture);
    reflection.setRenderEndNanoTime(System.nanoTime());
    rendering = false;
}
 
2,505
81
397
вызов renderWorld явно как-то портит загрузку чанков
Он не портит, а вызывает ее. Получается, что ты вызываешь апдейт чанков для своих рефлекшенов со своими позициями, а потом для игрока.
Попробуй написать свой метод renderWorld без апдейта чанков либо вставить хук в апдейт чанков с проверкой на твою глобал переменную.
 
Сверху