- 2
- 1
- 0
Хочу добавить размытие по гауссу для симуляции свечения объектов, для этого я решил использовать Framebuffer.
Реализовал размытие и казалось бы проблем должно и не быть
Однако, когда я пытаюсь перенести глубину из майнкрафт фреймбуфера, чтобы светящиеся объекты не торчали сквозь стены, возникают сильные графические артефакты:
Просидел часов 6, так и не понял в чем проблема, если что изучал работу фреймбуфера по гайду: https://forum.mcmodding.ru/resources/framebuffer-nachalo.183/
Реализовал размытие и казалось бы проблем должно и не быть
Однако, когда я пытаюсь перенести глубину из майнкрафт фреймбуфера, чтобы светящиеся объекты не торчали сквозь стены, возникают сильные графические артефакты:
Java:
GL11.glColor4f(1f, 1f, 1f,1f);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
int current = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
if(mcCopiedTexture == -1) {
mcCopiedTexture = glGenTextures();
glBindTexture(GL11.GL_TEXTURE_2D, mcCopiedTexture);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
glTexParameteri(GL11.GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL11.GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL11.GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
glTexParameteri(GL11.GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
}
if (framebuffer == null)
framebuffer = new Framebuffer(mc.displayWidth, mc.displayHeight, true);
if (mc.displayWidth != framebuffer.framebufferWidth
|| mc.displayHeight != framebuffer.framebufferHeight)
framebuffer.createBindFramebuffer(mc.displayWidth, mc.displayHeight);
framebuffer.bindFramebuffer(false);
GL11.glBindTexture(GL_TEXTURE_2D, mcCopiedTexture);
glCopyTexImage2D(GL_TEXTURE_2D,
0, GL_RGBA, 0, 0,
mc.getFramebuffer().framebufferTextureWidth,
mc.getFramebuffer().framebufferTextureHeight, 0);
GL30.glBindFramebuffer(GL_READ_FRAMEBUFFER, mc.getFramebuffer().framebufferObject);
//этот метод и вызывает ошибку
GL30.glBlitFramebuffer(0, 0,
mc.displayWidth, mc.displayHeight,
0, 0,
mc.displayWidth, mc.displayHeight,
GL_DEPTH_BUFFER_BIT,
GL_NEAREST);
GL11.glPushMatrix();
GL11.glBindTexture(GL_TEXTURE_2D, 0);
GlStateManager.color(0.5f,0.5f,1);
GL11.glTranslated(-Particle.interpPosX, -Particle.interpPosY, -Particle.interpPosZ);
GL11.glTranslatef(0, 3, 0);
GL11.glTranslatef(0, 0, 0.01f);
drawQuad();
GL11.glPopMatrix();
GL13.glActiveTexture(GL13.GL_TEXTURE3);
GL11.glBindTexture(GL_TEXTURE_2D, mcCopiedTexture);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
BlurShader blurShader = BlurShader.getInstance();
blurShader.start();
blurShader.loadHorizontal(false);
blurShader.loadHeight(mc.displayHeight);
blurShader.loadWidth(mc.displayWidth);
blurShader.loadImage(0);
blurShader.loadImageBack(3);
mc.getFramebuffer().bindFramebuffer(false);
GL11.glPushMatrix();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, framebuffer.framebufferTexture);
GL11.glMatrixMode(GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glMatrixMode(GL_MODELVIEW);
GL11.glLoadIdentity();
drawQuad();
GL11.glPopMatrix();
blurShader.stop();
framebuffer.framebufferClear();
mc.getFramebuffer().bindFramebuffer(false);
glBindTexture(GL_TEXTURE_2D, current);
Просидел часов 6, так и не понял в чем проблема, если что изучал работу фреймбуфера по гайду: https://forum.mcmodding.ru/resources/framebuffer-nachalo.183/