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);
float brightness = (color.r*0.2126) + (color.g*0.7152) + (color.b * 0.0722);
if (brightness > 0.7) {
gl_FragColor = color;
if (brightness > 0.6) {
gl_FragColor = color *0.75;
} else {
gl_FragColor = vec4(0.0);
}

View File

@ -11,18 +11,17 @@ varying vec2 vTexCoord;
uniform sampler2D u_texture;
uniform sampler2D u_texture1;
uniform float exposure;
void main() {
vec3 origColor = texture2D(u_texture, vTexCoord).rgb;
vec3 blurredColor = texture2D(u_texture1, vTexCoord).rgb;
vec4 origColor = texture2D(u_texture, vTexCoord);
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;
public class BloomShader implements Disposable {
private int bloomLevel;
private ShaderProgram gaussianBlurShader;
private ShaderProgram brightFilterShader;
private ShaderProgram combineShader;
@ -69,10 +68,10 @@ public class BloomShader implements Disposable {
combineShader.begin();
combineShader.setUniformi("u_texture1", 1);
combineShader.setUniformf("exposure", 0.5f);
combineShader.end();
gaussianBlurShader.begin();
gaussianBlurShader.setUniformf("radius", 1.5f);
gaussianBlurShader.setUniformf("resolution", hBlur.getWidth(), vBlur.getHeight());
gaussianBlurShader.end();
@ -110,7 +109,6 @@ public class BloomShader implements Disposable {
fboRegion.setTexture(lightFilterBuffer.getColorBufferTexture());
hBlur.begin();
screenBatch.setShader(gaussianBlurShader);
gaussianBlurShader.setUniformf("radius", 1f + 0.2f*(bloomLevel*1.75f));
gaussianBlurShader.setUniformi("pass", 0);
screenBatch.draw(fboRegion, 0f, 0f, width, height);
screenBatch.flush();
@ -134,14 +132,6 @@ public class BloomShader implements Disposable {
screenBatch.end(); //STAGE BATCH ENDS HERE
}
public void setBloomLevel(int bloomLevel) {
this.bloomLevel = bloomLevel;
}
public int getBloomLevel() {
return bloomLevel;
}
@Override
public void 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.ui.Label;
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.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.utils.Align;
public class GraphicsOptions extends Table {
private Label resolutions, shaders;
private Preferences prefs;
private Slider glowShaderLevel;
private Label resolutions;
private ResolutionButton
_3840x2160,
@ -26,21 +23,9 @@ public class GraphicsOptions extends Table {
_1366x768;
public GraphicsOptions(Skin skin, final Preferences prefs, ChangeListener bloomLevelSliderListener) {
public GraphicsOptions(Skin skin, final Preferences prefs) {
align(Align.center);
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);
add(resolutions).left();
row();
@ -90,14 +75,4 @@ public class GraphicsOptions extends Table {
row();
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 TextButton backButton;
public GraphicsPage(Skin skin, Preferences preferences, ChangeListener backButtonListener, ChangeListener bloomLevelSliderListener) {
public GraphicsPage(Skin skin, Preferences preferences, ChangeListener backButtonListener) {
super(-1, 1);
graphicsTable = new GraphicsOptions(skin, preferences, bloomLevelSliderListener);
graphicsTable = new GraphicsOptions(skin, preferences);
scrollPane = new ScrollPane(graphicsTable, skin);
scrollPane.setFadeScrollBars(false);
scrollPane.setFillParent(true);
@ -40,12 +40,4 @@ public class GraphicsPage extends Page {
public void act(float 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;
public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
private boolean resizing;
private Stage stage;
private Vector3 cameraPosition;
private Listeners listeners;
@ -84,18 +82,15 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
}
private void draw() {
if (!resizing) {
stage.getViewport().apply();
screenBatch.begin();
screenBatch.draw(background, 0, 0, stage.getViewport().getScreenWidth(), stage.getViewport().getScreenHeight());
screenBatch.end();
stage.draw();
}
stage.getViewport().apply();
screenBatch.begin();
screenBatch.draw(background, 0, 0, stage.getViewport().getScreenWidth(), stage.getViewport().getScreenHeight());
screenBatch.end();
stage.draw();
}
@Override
public void preAssetLoad() {
resizing = true;
stage.clear();
if (bloomShader != null) {
bloomShader.dispose();
@ -109,6 +104,8 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
@Override
public void postAssetLoad() {
bloomShader = new BloomShader(screenBatch);
background = rhythmBullet.getAssetManager().get("backgrounds/mainBG.png", Texture.class);
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);
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);
creditsPage = new CreditsPage(rhythmBullet.getSkin());
@ -134,7 +131,6 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
stage.addActor(analysisPage);
musicController.getMusicList().asyncSearch(false);
resizing = false;
}
@Override
@ -152,7 +148,6 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
public void saveAll() {
if (optionsPage != null) {
optionsPage.saveOptions();
graphicsPage.saveOptions();
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() {
@Override
public void changed(ChangeEvent event, Actor actor) {