From 2a9008f0420b28130ddf384fe08c2cd50d05d674 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 10 Jun 2020 21:07:21 -0400 Subject: [PATCH] Transition to Framebuffer#blit --- core/assets/maps/tarFields.msav | Bin 14385 -> 14257 bytes core/assets/shaders/light.frag | 5 +---- core/assets/shaders/screenspace.vert | 9 +++++++++ core/assets/shaders/shield.frag | 4 ++-- core/assets/shaders/slag.frag | 1 - core/assets/shaders/tar.frag | 1 - core/assets/shaders/water.frag | 1 - core/src/mindustry/core/Renderer.java | 6 +----- core/src/mindustry/graphics/CacheLayer.java | 4 +--- .../src/mindustry/graphics/LightRenderer.java | 4 +--- core/src/mindustry/graphics/Shaders.java | 16 +++++++++------- gradle.properties | 2 +- 12 files changed, 25 insertions(+), 28 deletions(-) create mode 100644 core/assets/shaders/screenspace.vert diff --git a/core/assets/maps/tarFields.msav b/core/assets/maps/tarFields.msav index 41e30e2a61d28812bbb3fde0a03c9fc465bb5b82..e4a99d71bfdfe16027b59f48512b691c06d80352 100644 GIT binary patch literal 14257 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 literal 14385 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 diff --git a/core/assets/shaders/light.frag b/core/assets/shaders/light.frag index ba35623dab..263c7300b7 100644 --- a/core/assets/shaders/light.frag +++ b/core/assets/shaders/light.frag @@ -3,15 +3,12 @@ precision mediump float; precision mediump int; #endif -#define steprad 0.13 - uniform sampler2D u_texture; uniform vec4 u_ambient; -varying vec4 v_color; varying vec2 v_texCoord; void main(){ - vec4 color = texture2D(u_texture, v_texCoord.xy); + vec4 color = texture2D(u_texture, v_texCoord); gl_FragColor = clamp(vec4(mix(u_ambient.rgb, color.rgb, color.a), u_ambient.a - color.a), 0.0, 1.0); } diff --git a/core/assets/shaders/screenspace.vert b/core/assets/shaders/screenspace.vert new file mode 100644 index 0000000000..a7376f44ec --- /dev/null +++ b/core/assets/shaders/screenspace.vert @@ -0,0 +1,9 @@ +attribute vec4 a_position; +attribute vec2 a_texCoord0; + +varying vec2 v_texCoord; + +void main(){ + v_texCoord = a_texCoord0; + gl_Position = a_position; +} diff --git a/core/assets/shaders/shield.frag b/core/assets/shaders/shield.frag index ae3831e5fb..e42997876c 100644 --- a/core/assets/shaders/shield.frag +++ b/core/assets/shaders/shield.frag @@ -14,8 +14,8 @@ uniform vec2 u_texsize; uniform float u_time; uniform float u_dp; uniform vec2 u_offset; +uniform vec4 u_shieldcolor; -varying vec4 v_color; varying vec2 v_texCoord; void main(){ @@ -32,7 +32,7 @@ void main(){ (texture2D(u_texture, T + vec2(0, step) * v).a > 0.0 || texture2D(u_texture, T + vec2(0, -step) * v).a > 0.0 || texture2D(u_texture, T + vec2(step, 0) * v).a > 0.0 || texture2D(u_texture, T + vec2(-step, 0) * v).a > 0.0)){ - gl_FragColor = mix(v_color, vec4(1.0), si); + gl_FragColor = mix(u_shieldcolor, vec4(1.0), si); }else{ if(color.a > 0.0){ diff --git a/core/assets/shaders/slag.frag b/core/assets/shaders/slag.frag index 5b87b982ab..e325c13629 100755 --- a/core/assets/shaders/slag.frag +++ b/core/assets/shaders/slag.frag @@ -15,7 +15,6 @@ uniform vec2 u_campos; uniform vec2 u_resolution; uniform float u_time; -varying vec4 v_color; varying vec2 v_texCoord; void main(){ diff --git a/core/assets/shaders/tar.frag b/core/assets/shaders/tar.frag index 4ca0e7be97..a2454c5e1f 100644 --- a/core/assets/shaders/tar.frag +++ b/core/assets/shaders/tar.frag @@ -12,7 +12,6 @@ uniform vec2 u_campos; uniform vec2 u_resolution; uniform float u_time; -varying vec4 v_color; varying vec2 v_texCoord; void main(){ diff --git a/core/assets/shaders/water.frag b/core/assets/shaders/water.frag index 1d2b67f889..3299c96abd 100644 --- a/core/assets/shaders/water.frag +++ b/core/assets/shaders/water.frag @@ -9,7 +9,6 @@ uniform vec2 u_campos; uniform vec2 u_resolution; uniform float u_time; -varying vec4 v_color; varying vec2 v_texCoord; const float mscl = 40.0; diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index 612131cf0e..b7ddd6f211 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -238,11 +238,7 @@ public class Renderer implements ApplicationListener{ Draw.drawRange(Layer.shields, 1f, () -> effectBuffer.begin(Color.clear), () -> { effectBuffer.end(); - Draw.shader(Shaders.shield); - Draw.color(Pal.accent); - Draw.rect(effectBuffer); - Draw.color(); - Draw.shader(); + effectBuffer.blit(Shaders.shield); }); } diff --git a/core/src/mindustry/graphics/CacheLayer.java b/core/src/mindustry/graphics/CacheLayer.java index 6363efae98..5807db7490 100644 --- a/core/src/mindustry/graphics/CacheLayer.java +++ b/core/src/mindustry/graphics/CacheLayer.java @@ -79,9 +79,7 @@ public enum CacheLayer{ renderer.blocks.floor.endc(); renderer.effectBuffer.end(); - Draw.shader(shader); - Draw.rect(renderer.effectBuffer); - Draw.shader(); + renderer.effectBuffer.blit(shader); renderer.blocks.floor.beginc(); } diff --git a/core/src/mindustry/graphics/LightRenderer.java b/core/src/mindustry/graphics/LightRenderer.java index a6c0c1c785..b8c93823b4 100644 --- a/core/src/mindustry/graphics/LightRenderer.java +++ b/core/src/mindustry/graphics/LightRenderer.java @@ -195,9 +195,7 @@ public class LightRenderer{ Draw.color(); Shaders.light.ambient.set(state.rules.ambientLight); - Draw.shader(Shaders.light); - Draw.rect(buffer); - Draw.shader(); + buffer.blit(Shaders.light); lights.clear(); } diff --git a/core/src/mindustry/graphics/Shaders.java b/core/src/mindustry/graphics/Shaders.java index 0e46e83d60..9a1d38b912 100644 --- a/core/src/mindustry/graphics/Shaders.java +++ b/core/src/mindustry/graphics/Shaders.java @@ -16,7 +16,7 @@ import static mindustry.Vars.renderer; public class Shaders{ public static BlockBuild blockbuild; - public static @Nullable Shield shield; + public static @Nullable ShieldShader shield; public static UnitBuild build; public static FogShader fog; public static LightShader light; @@ -30,7 +30,7 @@ public class Shaders{ public static void init(){ blockbuild = new BlockBuild(); try{ - shield = new Shield(); + shield = new ShieldShader(); }catch(Throwable t){ //don't load shield shader shield = null; @@ -119,7 +119,7 @@ public class Shaders{ public Color ambient = new Color(0.01f, 0.01f, 0.04f, 0.99f); public LightShader(){ - super("light", "default"); + super("light", "screenspace"); } @Override @@ -175,16 +175,18 @@ public class Shaders{ } } - public static class Shield extends LoadShader{ + public static class ShieldShader extends LoadShader{ + public Color color = Pal.accent.cpy(); - public Shield(){ - super("shield", "default"); + public ShieldShader(){ + super("shield", "screenspace"); } @Override public void apply(){ setUniformf("u_dp", Scl.scl(1f)); setUniformf("u_time", Time.time() / Scl.scl(1f)); + setUniformf("u_shieldcolor", color); setUniformf("u_offset", Core.camera.position.x - Core.camera.width / 2, Core.camera.position.y - Core.camera.height / 2); @@ -196,7 +198,7 @@ public class Shaders{ public static class SurfaceShader extends LoadShader{ public SurfaceShader(String frag){ - super(frag, "default"); + super(frag, "screenspace"); Core.assets.load("sprites/noise.png", Texture.class).loaded = t -> { ((Texture)t).setFilter(TextureFilter.Linear); diff --git a/gradle.properties b/gradle.properties index dff7027b91..89658f07d9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=53dae7fe3363a33793daa1d7036cc77f4e0e2797 +archash=5d845b94754aa9667c60de503624ff2a51df6e64