- 1,015
- 9
- 102
Я проинициализировал FrameBuffer в ClientProxy данным образом (вместе с буфером глубины)
В классе рендера Entity в методе doRender я отрисовал красный прямоугольник(для теста, и я знаю, что в этом методе он рисуется не на экране, а в мире, но все равно он должен быть виден) и своего Entity
Если рендрить это не в свой буфер, а в майновкий, то в мире это будет отрисовано. Далее я в эвенте RenderGameOverlayEvent.Pre рендрю на весь экран текстуру из своего буфера
Но в итоге мой шейдер принимает пустую текстуру, полностью черную, и рендрит соответственно черный прямоугольник. Почему моя текстура из буфера в итоге оказалась пустая?
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();
Но в итоге мой шейдер принимает пустую текстуру, полностью черную, и рендрит соответственно черный прямоугольник. Почему моя текстура из буфера в итоге оказалась пустая?