Kawase Glow Shader: смешивание белого цвета с фреймбуферомJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Kawase Glow Shader: смешивание белого цвета с фреймбуфером

Сообщение Anonymous »

Мне просто нравится создавать шейдеры для игр, и у меня возникла проблема: я использую очень простое многопроходное размытие кавасе.
Это работает хорошо, но когда я использую его для свечения объектов с включенным смешиванием, есть некоторые артефакты с белыми пятнами, выходящими за пределы объектов в фреймбуфере. Сообщите мне, если вам нужна дополнительная информация.
Итак, вот код шейдера:
#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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»