OpenGL не рендрит в мой FrameBuffer

Версия Minecraft
1.7.10
1,015
9
102
Я проинициализировал FrameBuffer в ClientProxy данным образом (вместе с буфером глубины)
Java:
        Minecraft mc = Minecraft.getMinecraft();
        framebufferId = glGenFramebuffers();
        glBindFramebuffer(GL_FRAMEBUFFER, framebufferId);

        renderedTextureId = glGenTextures();
        glBindTexture(GL_TEXTURE_2D, renderedTextureId);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, mc.displayWidth, mc.displayHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, (ByteBuffer) null);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

        depthRendererBufferId = glGenRenderbuffers();
        glBindRenderbuffer(GL_RENDERBUFFER, depthRendererBufferId);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, mc.displayWidth, mc.displayHeight);

        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRendererBufferId);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTextureId, 0, 0);
        glDrawBuffers(GL_COLOR_ATTACHMENT0);

        if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
            System.out.println("Framebuffer isn't ok");

В классе рендера Entity в методе doRender я отрисовал красный прямоугольник(для теста, и я знаю, что в этом методе он рисуется не на экране, а в мире, но все равно он должен быть виден) и своего Entity
Java:
            glDisable(GL_TEXTURE_2D);
            glEnable(GL_BLEND);
            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            glDisable(GL_LIGHTING);
            glColor4f(1, 1, 1, 1);

            glBindFramebuffer(GL_FRAMEBUFFER, ClientProxy.framebufferId);
            glViewport(0, 0, mc.displayWidth, mc.displayHeight);
            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

            Tessellator tes = Tessellator.instance;
            tes.setColorRGBA(255, 0, 0, 255);
            tes.startDrawingQuads();
            tes.addVertexWithUV(0, mc.displayHeight, 0, 0, 0);
            tes.addVertexWithUV(mc.displayWidth, mc.displayHeight, 0, 1, 0);
            tes.addVertexWithUV(mc.displayWidth, 0, 0, 1, 1);
            tes.addVertexWithUV(0, 0, 0, 0, 1);
            tes.draw();

            mc.getFramebuffer().bindFramebuffer(true);
            glViewport(0, 0, mc.displayWidth, mc.displayHeight);
            glEnable(GL_TEXTURE_2D);

Если рендрить это не в свой буфер, а в майновкий, то в мире это будет отрисовано. Далее я в эвенте RenderGameOverlayEvent.Pre рендрю на весь экран текстуру из своего буфера
Java:
            glEnable(GL_BLEND);
            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            ScaledResolution res = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight);
            Tessellator tes = Tessellator.instance;
            ModShaders.bloom.start();
            ARBShaderObjects.glUniform2fARB(ModShaders.shield.getUniform("textureSize"), mc.displayWidth, mc.displayHeight);
            glActiveTexture(GL_TEXTURE0);
            glBindTexture(GL_TEXTURE_2D, ClientProxy.renderedTextureId);
            glBindRenderbuffer(GL_RENDERBUFFER, ClientProxy.depthRendererBufferId);
            tes.startDrawingQuads();
            tes.addVertexWithUV(0, res.getScaledHeight(), 0, 0, 0);
            tes.addVertexWithUV(res.getScaledWidth(), res.getScaledHeight(), 0, 1, 0);
            tes.addVertexWithUV(res.getScaledWidth(), 0, 0, 1, 1);
            tes.addVertexWithUV(0, 0, 0, 0, 1);
            tes.draw();
            ModShaders.bloom.stop();

Но в итоге мой шейдер принимает пустую текстуру, полностью черную, и рендрит соответственно черный прямоугольник. Почему моя текстура из буфера в итоге оказалась пустая?
 
Решение
Java:
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTextureId, 0, 0);
meanwhile спецификация
C:
void glFramebufferTexture2D(GLenum target,
     GLenum attachment,
     GLenum textarget,
     GLuint texture,
     GLint level);
у тебя должно быть так:
Java:
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderedTextureId, 0);
1,038
57
229
Но в итоге мой шейдер принимает пустую текстуру, полностью черную
Если рендрить это не в свой буфер, а в майновкий то в мире это будет отрисовано
Ты либо делаешь не в том месте, либо не там.
Ну и хотелось бы убедиться что она действительно пустая. Как ты это проверил?
 
Последнее редактирование:
1,015
9
102
В свой шейдер, это однозначна, т.к. я его бинжу до бинда текстуры. Другой шейдер в это время тоже не может работать, так как одновременно много шейдеров не могут быть забинжены. Не в том месте всм? После установки шейдера и до рендера, видно же. Я это проверил "на глаз", просто полностью черный цвет везде выводится
 
1,038
57
229
Давай по другому скажу. Когда я делал скелетную анимацию натягивания лука я обнаружил что если рисовать не в хуке рендера, то рендер то работает, то нет. То есть во время события рендер допустим того же игрока, он выключает свой шейдер (или что-то другое там делает) и позволяет тебе рисовать своё. При этом, как у тебя и сделано. Ты должен включить свой шейдер, а отрисовав выключить. Иначе он со следующей рисовкой будут проблемы.
Также у меня были проблемы с путями, ни в какую не работали Class.getResource() и getResourceAsStream(), оказалось что надо настроить в IntelliJ папку res, что она основная (не смотря на то что написано что работает из коробки).
Я к тому времени уже плюнул (не найдя ответ) и просто биндил текстуру манйовскими утилитами, а рисовал что мне надо шейдером. Но это не подходит если текстур у тебя не одна в модели.
А вообще посмотри исходник animatrix ldtteam/Animatrix
 
1,015
9
102
Разве в старых версиях матрица не создается командами glRotate, glScale, glTranslate и не помещается в gl_ModelViewProjectionMatrix в шейдер? Или при установке нового буфера их надо как-то задавать по-новому? Если это так, то откуда их брать, что бы они были равны мировым?
 
Последнее редактирование:
1,015
9
102
Удалил. Ничего не поменялось. Так же пробовал перекинуть матрицы, тоже ничего не дало
Java:
FloatBuffer modelview = GLAllocation.createDirectFloatBuffer(16);
FloatBuffer projection = GLAllocation.createDirectFloatBuffer(16);
GL11.glGetFloat(GL_MODELVIEW_MATRIX, modelview);
GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projection);

glBindFramebuffer(GL_FRAMEBUFFER, ClientProxy.framebufferId);
glMatrixMode(GL_PROJECTION);
glLoadMatrix(projection);
glMatrixMode(GL_MODELVIEW);
glLoadMatrix(modelview);
 
1,990
18
105
Java:
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTextureId, 0, 0);
meanwhile спецификация
C:
void glFramebufferTexture2D(GLenum target,
     GLenum attachment,
     GLenum textarget,
     GLuint texture,
     GLint level);
у тебя должно быть так:
Java:
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderedTextureId, 0);
 
Сверху