У меня возникла проблема: я использую очень простое многопроходное размытие кавасэ.
Оно работает хорошо, но когда я использую его для свечения объектов при включенном смешивании, возникают некоторые артефакты с некоторым белым расширением объектов. в фреймбуфере.
Итак, вот код шейдера:
#version 120
uniform sampler2D iChannel0;
uniform vec2 iResolution;
uniform float radius;
void main() {
vec2 uv = gl_TexCoord[0].st;
vec2 res = iResolution;
vec4 col = vec4(0.0);
col += texture2D(iChannel0, uv + vec2(radius, radius) / res);
col += texture2D(iChannel0, uv + vec2(radius, -radius) / res);
col += texture2D(iChannel0, uv + vec2(-radius, radius) / res);
col += texture2D(iChannel0, uv + vec2(-radius, -radius) / res);
col /= 4.0;
gl_FragColor = col;
}
Вот мой класс свечения:
public final class RenderGlow implements InstanceAccess {
@Setter
private float radius;
private final Framebuffer[] blurFramebuffers;
public RenderGlow(final float radius, final int iterations) {
this.radius = radius / iterations;
this.blurFramebuffers = new Framebuffer[iterations];
for (int i = 0; i < blurFramebuffers.length; i++) {
blurFramebuffers = new Framebuffer(1, 1,false);
}
}
private void refreshFramebuffers() {
for (int i = 0; i < blurFramebuffers.length; i++) {
blurFramebuffers = FramebufferUtil.createFrameBuffer(blurFramebuffers,true);
}
}
public void glow(final Framebuffer framebufferGlow) {
refreshFramebuffers();
performGlowPass(0, framebufferGlow.framebufferTexture);
for (int i = 1; i < blurFramebuffers.length; i++) {
performGlowPass(i, blurFramebuffers.framebufferTexture);
}
mc.getFramebuffer().bindFramebuffer(true);
glBindTexture(GL_TEXTURE_2D, blurFramebuffers[blurFramebuffers.length - 1].framebufferTexture);
blurShader.start();
setupGlowUniforms(radius + (blurFramebuffers.length - 1));
GlStateManager.enableBlend();
OpenGlHelper.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
blurShader.drawQuads();
blurShader.stop();
GlStateManager.disableBlend();
GlStateManager.color(1, 1, 1, 1);
GlStateManager.bindTexture(0);
}
private void performGlowPass(final int index, final int sourceTexture) {
blurFramebuffers[index].framebufferClear();
blurFramebuffers[index].bindFramebuffer(true);
blurShader.start();
glBindTexture(GL_TEXTURE_2D, sourceTexture);
setupGlowUniforms(radius + index);
blurShader.drawQuads();
blurShader.stop();
blurFramebuffers[index].unbindFramebuffer();
}
private void setupGlowUniforms(final float radius) {
blurShader.setUniform("iChannel0", 0);
blurShader.setUniform("iResolution", (float) mc.displayWidth, (float) mc.displayHeight);
blurShader.setUniform("radius", radius);
}
}
И, наконец, здесь я создаю фреймбуфер с объектами на нем:
public static Framebuffer glowFramebuffer = new Framebuffer(1, 1, false);
public static void drawGlow() {
if (mc.gameSettings.ofFastRender || glowRunnables.isEmpty())
return;
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
glowFramebuffer = FramebufferUtil.createFrameBuffer(glowFramebuffer, true);
glowFramebuffer.framebufferClear();
glowFramebuffer.bindFramebuffer(true);
GlStateManager.disableAlpha();
GlStateManager.enableTexture2D();
GlStateManager.disableLighting();
for (Runnable runnable : glowRunnables) {
runnable.run();
}
glowFramebuffer.unbindFramebuffer();
renderGlow.glow(glowFramebuffer);
glowRunnables.clear();
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... ramebuffer