decent bloom system

This commit is contained in:
Harrison Deng 2018-09-03 23:54:23 -05:00
parent 3c3d925e5a
commit 24dcabfb51
6 changed files with 25 additions and 93 deletions

View File

@ -14,8 +14,8 @@ void main() {
vec4 color = texture(u_texture, vTexCoord); vec4 color = texture(u_texture, vTexCoord);
float brightness = (color.r*0.2126) + (color.g*0.7152) + (color.b * 0.0722); float brightness = (color.r*0.2126) + (color.g*0.7152) + (color.b * 0.0722);
if (brightness > 0.7) { if (brightness > 0.6) {
gl_FragColor = color; gl_FragColor = color *0.75;
} else { } else {
gl_FragColor = vec4(0.0); gl_FragColor = vec4(0.0);
} }

View File

@ -11,18 +11,17 @@ varying vec2 vTexCoord;
uniform sampler2D u_texture; uniform sampler2D u_texture;
uniform sampler2D u_texture1; uniform sampler2D u_texture1;
uniform float exposure;
void main() { void main() {
vec3 origColor = texture2D(u_texture, vTexCoord).rgb; vec4 origColor = texture2D(u_texture, vTexCoord);
vec3 blurredColor = texture2D(u_texture1, vTexCoord).rgb; vec4 blurredColor = texture2D(u_texture1, vTexCoord);
vec4 result;
result = origColor + blurredColor;
result.a = vColor.a;
result.rgb *= vColor.rgb;
gl_FragColor = result;
const float gamma = 2.2;
origColor += blurredColor; // additive blending
// tone mapping
vec3 result = vec3(1.0) - exp(-origColor * exposure);
// also gamma correct while we're at it
result = pow(result, vec3(1.0 / gamma));
gl_FragColor = vec4(result, 1.0);
} }

View File

@ -12,7 +12,6 @@ import com.badlogic.gdx.utils.Disposable;
import com.badlogic.gdx.utils.viewport.ScreenViewport; import com.badlogic.gdx.utils.viewport.ScreenViewport;
public class BloomShader implements Disposable { public class BloomShader implements Disposable {
private int bloomLevel;
private ShaderProgram gaussianBlurShader; private ShaderProgram gaussianBlurShader;
private ShaderProgram brightFilterShader; private ShaderProgram brightFilterShader;
private ShaderProgram combineShader; private ShaderProgram combineShader;
@ -69,10 +68,10 @@ public class BloomShader implements Disposable {
combineShader.begin(); combineShader.begin();
combineShader.setUniformi("u_texture1", 1); combineShader.setUniformi("u_texture1", 1);
combineShader.setUniformf("exposure", 0.5f);
combineShader.end(); combineShader.end();
gaussianBlurShader.begin(); gaussianBlurShader.begin();
gaussianBlurShader.setUniformf("radius", 1.5f);
gaussianBlurShader.setUniformf("resolution", hBlur.getWidth(), vBlur.getHeight()); gaussianBlurShader.setUniformf("resolution", hBlur.getWidth(), vBlur.getHeight());
gaussianBlurShader.end(); gaussianBlurShader.end();
@ -110,7 +109,6 @@ public class BloomShader implements Disposable {
fboRegion.setTexture(lightFilterBuffer.getColorBufferTexture()); fboRegion.setTexture(lightFilterBuffer.getColorBufferTexture());
hBlur.begin(); hBlur.begin();
screenBatch.setShader(gaussianBlurShader); screenBatch.setShader(gaussianBlurShader);
gaussianBlurShader.setUniformf("radius", 1f + 0.2f*(bloomLevel*1.75f));
gaussianBlurShader.setUniformi("pass", 0); gaussianBlurShader.setUniformi("pass", 0);
screenBatch.draw(fboRegion, 0f, 0f, width, height); screenBatch.draw(fboRegion, 0f, 0f, width, height);
screenBatch.flush(); screenBatch.flush();
@ -134,14 +132,6 @@ public class BloomShader implements Disposable {
screenBatch.end(); //STAGE BATCH ENDS HERE screenBatch.end(); //STAGE BATCH ENDS HERE
} }
public void setBloomLevel(int bloomLevel) {
this.bloomLevel = bloomLevel;
}
public int getBloomLevel() {
return bloomLevel;
}
@Override @Override
public void dispose() { public void dispose() {
brightFilterShader.dispose(); brightFilterShader.dispose();

View File

@ -5,16 +5,13 @@ import com.badlogic.gdx.Preferences;
import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Slider;
import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Align;
public class GraphicsOptions extends Table { public class GraphicsOptions extends Table {
private Label resolutions, shaders; private Label resolutions;
private Preferences prefs;
private Slider glowShaderLevel;
private ResolutionButton private ResolutionButton
_3840x2160, _3840x2160,
@ -26,21 +23,9 @@ public class GraphicsOptions extends Table {
_1366x768; _1366x768;
public GraphicsOptions(Skin skin, final Preferences prefs, ChangeListener bloomLevelSliderListener) { public GraphicsOptions(Skin skin, final Preferences prefs) {
align(Align.center); align(Align.center);
defaults().space(10f); defaults().space(10f);
this.prefs = prefs;
shaders = new Label("OpenGL Shader", skin);
add(shaders).fillX();
row();
glowShaderLevel = new Slider(0, 4, 1, false, skin);
add(glowShaderLevel).fillX();
glowShaderLevel.addListener(bloomLevelSliderListener);
glowShaderLevel.setValue(prefs.getInteger("glow shader"));
row();
resolutions = new Label("Resolutions: ", skin); resolutions = new Label("Resolutions: ", skin);
add(resolutions).left(); add(resolutions).left();
row(); row();
@ -90,14 +75,4 @@ public class GraphicsOptions extends Table {
row(); row();
pack(); pack();
} }
public void saveOptions() {
Gdx.app.debug("Preferences", "Saved shading values values.");
prefs.putInteger("glow shader", (int) glowShaderLevel.getValue());
}
public int getBloomShaderLevel() {
return (int) glowShaderLevel.getValue();
}
} }

View File

@ -15,9 +15,9 @@ public class GraphicsPage extends Page {
private GraphicsOptions graphicsTable; private GraphicsOptions graphicsTable;
private TextButton backButton; private TextButton backButton;
public GraphicsPage(Skin skin, Preferences preferences, ChangeListener backButtonListener, ChangeListener bloomLevelSliderListener) { public GraphicsPage(Skin skin, Preferences preferences, ChangeListener backButtonListener) {
super(-1, 1); super(-1, 1);
graphicsTable = new GraphicsOptions(skin, preferences, bloomLevelSliderListener); graphicsTable = new GraphicsOptions(skin, preferences);
scrollPane = new ScrollPane(graphicsTable, skin); scrollPane = new ScrollPane(graphicsTable, skin);
scrollPane.setFadeScrollBars(false); scrollPane.setFadeScrollBars(false);
scrollPane.setFillParent(true); scrollPane.setFillParent(true);
@ -40,12 +40,4 @@ public class GraphicsPage extends Page {
public void act(float delta) { public void act(float delta) {
super.act(delta); super.act(delta);
} }
public void saveOptions() {
graphicsTable.saveOptions();
}
public int getBloomLevel() {
return graphicsTable.getBloomShaderLevel();
}
} }

View File

@ -22,8 +22,6 @@ import zero1hd.rhythmbullet.graphics.ui.Page;
import zero1hd.rhythmbullet.util.ResizeReadyScreen; import zero1hd.rhythmbullet.util.ResizeReadyScreen;
public class MainScreen extends ScreenAdapter implements ResizeReadyScreen { public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
private boolean resizing;
private Stage stage; private Stage stage;
private Vector3 cameraPosition; private Vector3 cameraPosition;
private Listeners listeners; private Listeners listeners;
@ -84,18 +82,15 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
} }
private void draw() { private void draw() {
if (!resizing) {
stage.getViewport().apply(); stage.getViewport().apply();
screenBatch.begin(); screenBatch.begin();
screenBatch.draw(background, 0, 0, stage.getViewport().getScreenWidth(), stage.getViewport().getScreenHeight()); screenBatch.draw(background, 0, 0, stage.getViewport().getScreenWidth(), stage.getViewport().getScreenHeight());
screenBatch.end(); screenBatch.end();
stage.draw(); stage.draw();
} }
}
@Override @Override
public void preAssetLoad() { public void preAssetLoad() {
resizing = true;
stage.clear(); stage.clear();
if (bloomShader != null) { if (bloomShader != null) {
bloomShader.dispose(); bloomShader.dispose();
@ -109,6 +104,8 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
@Override @Override
public void postAssetLoad() { public void postAssetLoad() {
bloomShader = new BloomShader(screenBatch);
background = rhythmBullet.getAssetManager().get("backgrounds/mainBG.png", Texture.class); background = rhythmBullet.getAssetManager().get("backgrounds/mainBG.png", Texture.class);
mainPage = new MainPage(musicController, musicMetadataController, rhythmBullet.getAssetManager(), rhythmBullet.getSkin(), rhythmBullet.getScreenConfiguration(), listeners.musicSelectionPageButtonListener, listeners.optionsPageButtonListener); mainPage = new MainPage(musicController, musicMetadataController, rhythmBullet.getAssetManager(), rhythmBullet.getSkin(), rhythmBullet.getScreenConfiguration(), listeners.musicSelectionPageButtonListener, listeners.optionsPageButtonListener);
@ -121,7 +118,7 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
keybindPage = new KeybindPage(rhythmBullet.getAssetManager(), rhythmBullet.getSkin(), listeners.optionsPageButtonListener); keybindPage = new KeybindPage(rhythmBullet.getAssetManager(), rhythmBullet.getSkin(), listeners.optionsPageButtonListener);
stage.addActor(keybindPage); stage.addActor(keybindPage);
graphicsPage = new GraphicsPage(rhythmBullet.getSkin(), rhythmBullet.getPreferences(), listeners.optionsPageButtonListener, listeners.bloomLevelShaderListener); graphicsPage = new GraphicsPage(rhythmBullet.getSkin(), rhythmBullet.getPreferences(), listeners.optionsPageButtonListener);
stage.addActor(graphicsPage); stage.addActor(graphicsPage);
creditsPage = new CreditsPage(rhythmBullet.getSkin()); creditsPage = new CreditsPage(rhythmBullet.getSkin());
@ -134,7 +131,6 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
stage.addActor(analysisPage); stage.addActor(analysisPage);
musicController.getMusicList().asyncSearch(false); musicController.getMusicList().asyncSearch(false);
resizing = false;
} }
@Override @Override
@ -152,7 +148,6 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
public void saveAll() { public void saveAll() {
if (optionsPage != null) { if (optionsPage != null) {
optionsPage.saveOptions(); optionsPage.saveOptions();
graphicsPage.saveOptions();
rhythmBullet.getPreferences().flush(); rhythmBullet.getPreferences().flush();
} }
} }
@ -228,25 +223,6 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
} }
}; };
ChangeListener bloomLevelShaderListener = new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
int bloomLevel = 0;
if (graphicsPage != null) {
bloomLevel = graphicsPage.getBloomLevel();
} else {
bloomLevel = rhythmBullet.getPreferences().getInteger("glow shader");
}
if (bloomLevel > 0) {
if (bloomShader == null) bloomShader = new BloomShader(screenBatch);
bloomShader.setBloomLevel((bloomLevel-1));
} else if (bloomShader != null) {
bloomShader.dispose();
bloomShader = null;
}
}
};
ChangeListener confirmedSongListener = new ChangeListener() { ChangeListener confirmedSongListener = new ChangeListener() {
@Override @Override
public void changed(ChangeEvent event, Actor actor) { public void changed(ChangeEvent event, Actor actor) {