Повторная отрисовка чанков

Версия Minecraft
1.12.2
API
Forge
129
2
9
Хотел сделать тени от своих источников света. Решил воспользоваться методом карт теней. Сделал я значит следующее:
В RenderGlobal есть метод renderBlockLayer в котором рисуются чанки. Работал я именно с этим методом. Первым делом отрисовал чанки в своем фреймбуффере для получения глубины
renderBlockLayer:
@Override
public void renderBlockLayer(BlockRenderLayer blockLayerIn) {
    framebuffer = initFrameBuffer(framebuffer);
    framebuffer.bind(true);
    shaderDepth.bind();
    render(blockLayerIn);
    shaderDepth.unbind();
    framebuffer.unbind();
}

public void render(BlockRenderLayer blockLayerIn) {
        if (OpenGlHelper.useVbo())
        {
                GlStateManager.glEnableClientState(32884);
                OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit);
                GlStateManager.glEnableClientState(32888);
                OpenGlHelper.setClientActiveTexture(OpenGlHelper.lightmapTexUnit);
                GlStateManager.glEnableClientState(32888);
                OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit);
                GlStateManager.glEnableClientState(32886);
        }
        this.renderContainer.renderChunkLayer(blockLayerIn);
        if (OpenGlHelper.useVbo())
        {
            for (VertexFormatElement vertexformatelement : DefaultVertexFormats.BLOCK.getElements())
            {
                VertexFormatElement.EnumUsage vertexformatelement$enumusage = vertexformatelement.getUsage();
                int k1 = vertexformatelement.getIndex();

                switch (vertexformatelement$enumusage)
                {
                    case POSITION:
                        GlStateManager.glDisableClientState(32884);
                        break;
                    case UV:
                        OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit + k1);
                        GlStateManager.glDisableClientState(32888);
                        OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit);
                        break;
                    case COLOR:
                        GlStateManager.glDisableClientState(32886);
                        GlStateManager.resetColor();
                }
            }

        }
}
public FrameBuffer initFrameBuffer(FrameBuffer framebuffer) {
        if (framebuffer == null) {
            framebuffer = new FrameBuffer(1024, 1024);
            framebuffer.bind(false);
            GL11.glDrawBuffer(GL11.GL_NONE);
            GL11.glReadBuffer(GL11.GL_NONE);
            framebuffer.createDepthTexture();
            framebuffer.unbind();
        }
        return framebuffer;
}
Его содержимое я проверял, все в порядке.
Затем мне нужно отрендерить чанки уже в ванильном фреймбуффере, и тут уже начинается проблема (чанки уже не отрисовываются)
Java:
mc.getFramebuffer().bindFramebuffer(true);
this.render(blockLayerIn);

1714732225696.png
Подебажил все это дело, и вот несколько моментов:
1. Если в свой фреймбуффер я ничего не буду рисовать, то в ванильном фбо все рисуется спокойно. Т.е. мой фреймбуффер ничего не ломает.
2. Если в свой фреймбуффер я просто буду рисовать чанки, т.е. без этой проверки (Насколько я понял, это подключение текстур):
1714732400441.png
то ситуация будет точно такой же как и в ванильном фбо, ничего рисоваться не будет, что и логично.
3. Заглянул я значит в метод this.renderContainer.renderChunkLayer(blockLayerIn); и заметил что после отрисовки лист чанков очищается, и подумал что проблема может быть в этом
1714733234320.png
Для проверки хукнулся в этот метод и закомментил строку this.renderChunks.clear();
Увы, ничего не поменялось.

Есть у кого предположения как решать?
 
Последнее редактирование:
Решение
Решил проблему. Неправильно использовал хук, в аннотации писал injectOnExit = false, хотя надо было returnCondition = ReturnCondition.ALWAYS....
Теперь отчистка листов больше не происходит и чанки спокойно рендерятся в фбо майна.
Скорее всего, изображение с твоего ФБО полностью замещает изображение в майноФБО
Ну не знаю. Для проверки отрисовал квад перед собой в своем фбо, чанки в свою очередь спокойно рисовались в ванильном
Java:
         framebuffer.bind(true);
         shaderDepth.bind();
         Tessellator tessellator = Tessellator.getInstance();
         BufferBuilder buffer = tessellator.getBuffer();
         GL11.glPushMatrix();
         GL11.glTranslated(1, 1, -2);
         buffer.begin(7, DefaultVertexFormats.POSITION_TEX);
         buffer.pos(-1, -1, 0).tex(0, 0).endVertex();
         buffer.pos(1, -1, 0).tex(1, 0).endVertex();
         buffer.pos(1, 1, 0).tex(1, 1).endVertex();
         buffer.pos(-1, 1, 0).tex(0, 1).endVertex();
         tessellator.draw();
         GL11.glPopMatrix();
         //this.render(blockLayerIn);
         shaderDepth.unbind();
         framebuffer.unbind();
      
         mc.getFramebuffer().bindFramebuffer(true);
         this.render(blockLayerIn);
Мой фбо:
1714740499544.png
Фбо майна:
1714740523089.png
 
Последнее редактирование:
так мне это и не надо.
Мне не нужно чтобы в ванильном фбо было то, что у меня в своем. Чанки должны отрендерится независимо от моего фбо, но вот как раз таки в этом и проблема, они не рендерятся в фбо майна если я их перед этим отрендерю еще и в своем фбо, и мне надо это как то исправить. Второй раз вызов рендера чанков будто бы игнорируется
 
Последнее редактирование:
так мне это и не надо.
А, понял. Ну, во первых да, тебе не нужно очищать рендерчанки, либо копировать renderChunks себе и рисовать через откопированный список.
Во вторых, может быть проблема в multModelViewMatrix()
Плюс, анбинд буффера может играть роль в конце
Хз, тут точно не скажу
Надо пробовать вырезать участки кода и смотреть меняется ли чото
 
Так, я выяснил, что renderChunks все же отчищается после первого вызова рендера, хотя я хукался и убирал эту строку... Сам же хук работает, это я проверил. Значит возможно что лист отчищается где то еще, пойду поищу
 
Решил проблему. Неправильно использовал хук, в аннотации писал injectOnExit = false, хотя надо было returnCondition = ReturnCondition.ALWAYS....
Теперь отчистка листов больше не происходит и чанки спокойно рендерятся в фбо майна.
 
Последнее редактирование:
Назад
Сверху