Мне просто нравится создавать шейдеры для игр, и у меня возникла проблема: я использую очень простое многопроходное размытие кавасе.
Это работает хорошо, но когда я использую его для свечения объектов с включенным смешиванием, есть некоторые артефакты с белыми пятнами, выходящими за пределы объектов в фреймбуфере. Сообщите мне, если вам нужна дополнительная информация.
Итак, вот код шейдера:
#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
Kawase Glow Shader: смешивание белого цвета с фреймбуфером ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1728233739
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[i] = new Framebuffer(1, 1,false);
}
}
private void refreshFramebuffers() {
for (int i = 0; i < blurFramebuffers.length; i++) {
blurFramebuffers[i] = FramebufferUtil.createFrameBuffer(blurFramebuffers[i],true);
}
}
public void glow(final Framebuffer framebufferGlow) {
refreshFramebuffers();
performGlowPass(0, framebufferGlow.framebufferTexture);
for (int i = 1; i < blurFramebuffers.length; i++) {
performGlowPass(i, blurFramebuffers[i - 1].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();
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79059557/kawase-glow-shader-mixing-white-with-framebuffer[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия