decent bloom system
This commit is contained in:
parent
3c3d925e5a
commit
24dcabfb51
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user