diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index 8f25e7de6b..617dc0cf22 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -220,6 +220,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks private int uniBlockSmall; private int uniBlockLarge; private int uniBlockMain; + private int uniSmoothBanding; @Override protected void startUp() @@ -425,10 +426,16 @@ public class GpuPlugin extends Plugin implements DrawCallbacks Template template = new Template(resourceLoader); String source = template.process(resourceLoader.apply("geom.glsl")); + template = new Template(resourceLoader); + String vertSource = template.process(resourceLoader.apply("vert.glsl")); + + template = new Template(resourceLoader); + String fragSource = template.process(resourceLoader.apply("frag.glsl")); + GLUtil.loadShaders(gl, glProgram, glVertexShader, glGeomShader, glFragmentShader, - inputStreamToString(getClass().getResourceAsStream("vert.glsl")), + vertSource, source, - inputStreamToString(getClass().getResourceAsStream("frag.glsl"))); + fragSource); glComputeProgram = gl.glCreateProgram(); glComputeShader = gl.glCreateShader(gl.GL_COMPUTE_SHADER); @@ -463,6 +470,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks { uniProjectionMatrix = gl.glGetUniformLocation(glProgram, "projectionMatrix"); uniBrightness = gl.glGetUniformLocation(glProgram, "brightness"); + uniSmoothBanding = gl.glGetUniformLocation(glProgram, "smoothBanding"); uniTex = gl.glGetUniformLocation(glUiProgram, "tex"); uniTextures = gl.glGetUniformLocation(glProgram, "textures"); @@ -931,6 +939,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks // Brightness happens to also be stored in the texture provider, so we use that gl.glUniform1f(uniBrightness, (float) textureProvider.getBrightness()); + gl.glUniform1f(uniSmoothBanding, config.smoothBanding() ? 0f : 1f); for (int id = 0; id < textures.length; ++id) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java index 5e2cedd8dc..378f36e0cd 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java @@ -34,10 +34,22 @@ public interface GpuPluginConfig extends Config @ConfigItem( keyName = "drawDistance", name = "Draw Distance", - description = "Draw distance" + description = "Draw distance", + position = 1 ) default int drawDistance() { return 25; } + + @ConfigItem( + keyName = "smoothBanding", + name = "Remove Color Banding", + description = "Smooths out the color banding that is present in the CPU renderer", + position = 2 + ) + default boolean smoothBanding() + { + return false; + } } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl index a6aeae0338..8973b8b7e9 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl @@ -27,14 +27,23 @@ uniform sampler2DArray textures; uniform vec2 textureOffsets[64]; uniform float brightness; +uniform float smoothBanding; in vec4 Color; +in float fHsl; in vec4 fUv; + out vec4 FragColor; +#include hsl_to_rgb.glsl + void main() { float n = fUv.x; + int hsl = int(fHsl); + vec3 rgb = hslToRgb(hsl) * smoothBanding + Color.rgb * (1.f - smoothBanding); + vec4 smoothColor = vec4(rgb, Color.a); + if (n > 0.0) { n -= 1.0; int textureIdx = int(n); @@ -45,8 +54,8 @@ void main() { vec4 textureColor = texture(textures, vec3(animatedUv, n)); vec4 textureColorBrightness = pow(textureColor, vec4(brightness, brightness, brightness, 1.0f)); - FragColor = textureColorBrightness * Color; + FragColor = textureColorBrightness * smoothColor; } else { - FragColor = Color; + FragColor = smoothColor; } } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl index 4183af2f54..b9b328d62e 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl @@ -47,9 +47,11 @@ uniform mat4 projectionMatrix; in ivec3 vPosition[]; in vec4 vColor[]; +in float vHsl[]; in vec4 vUv[]; out vec4 Color; +out float fHsl; out vec4 fUv; #include to_screen.glsl @@ -67,18 +69,21 @@ void main() { vec4 tmp = vec4(screenA.xyz, 1.0); Color = vColor[0]; + fHsl = vHsl[0]; fUv = vUv[0]; gl_Position = projectionMatrix * tmp; EmitVertex(); tmp = vec4(screenB.xyz, 1.0); Color = vColor[1]; + fHsl = vHsl[1]; fUv = vUv[1]; gl_Position = projectionMatrix * tmp; EmitVertex(); tmp = vec4(screenC.xyz, 1.0); Color = vColor[2]; + fHsl = vHsl[2]; fUv = vUv[2]; gl_Position = projectionMatrix * tmp; EmitVertex(); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/hsl_to_rgb.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/hsl_to_rgb.glsl new file mode 100644 index 0000000000..762d1ea591 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/hsl_to_rgb.glsl @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +vec3 hslToRgb(int hsl) { + int var5 = hsl / 128; + float var6 = float(var5 >> 3) / 64.0f + 0.0078125f; + float var8 = float(var5 & 7) / 8.0f + 0.0625f; + + int var10 = hsl % 128; + + float var11 = float(var10) / 128.0f; + float var13 = var11; + float var15 = var11; + float var17 = var11; + + if(var8 != 0.0f) { + float var19; + if(var11 < 0.5f) { + var19 = var11 * (1.0f + var8); + } else { + var19 = var11 + var8 - var11 * var8; + } + + float var21 = 2.0f * var11 - var19; + float var23 = var6 + 0.3333333333333333f; + if(var23 > 1.0f) { + var23 -= 1.f; + } + + float var27 = var6 - 0.3333333333333333f; + if(var27 < 0.0f) { + var27 += 1.f; + } + + if(6.0f * var23 < 1.0f) { + var13 = var21 + (var19 - var21) * 6.0f * var23; + } else if(2.0f * var23 < 1.0f) { + var13 = var19; + } else if(3.0f * var23 < 2.0f) { + var13 = var21 + (var19 - var21) * (0.6666666666666666f - var23) * 6.0f; + } else { + var13 = var21; + } + + if(6.0f * var6 < 1.0f) { + var15 = var21 + (var19 - var21) * 6.0f * var6; + } else if(2.0f * var6 < 1.0f) { + var15 = var19; + } else if(3.0f * var6 < 2.0f) { + var15 = var21 + (var19 - var21) * (0.6666666666666666f - var6) * 6.0f; + } else { + var15 = var21; + } + + if(6.0f * var27 < 1.0f) { + var17 = var21 + (var19 - var21) * 6.0f * var27; + } else if(2.0f * var27 < 1.0f) { + var17 = var19; + } else if(3.0f * var27 < 2.0f) { + var17 = var21 + (var19 - var21) * (0.6666666666666666f - var27) * 6.0f; + } else { + var17 = var21; + } + } + + vec3 rgb = vec3( + pow(var13, brightness), + pow(var15, brightness), + pow(var17, brightness) + ); + + // I don't think we actually need this + if (rgb == vec3(0, 0, 0)) { + rgb = vec3(0, 0, 1/255.f); + } + + return rgb; +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl index e8652d2714..e9205ba81d 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl @@ -32,83 +32,10 @@ uniform float brightness; out ivec3 vPosition; out vec4 vColor; +out float vHsl; out vec4 vUv; -vec3 hslToRgb(int hsl) { - int var5 = hsl/128; - float var6 = float(var5 >> 3) / 64.0f + 0.0078125f; - float var8 = float(var5 & 7) / 8.0f + 0.0625f; - - int var10 = hsl % 128; - - float var11 = float(var10) / 128.0f; - float var13 = var11; - float var15 = var11; - float var17 = var11; - - if(var8 != 0.0f) { - float var19; - if(var11 < 0.5f) { - var19 = var11 * (1.0f + var8); - } else { - var19 = var11 + var8 - var11 * var8; - } - - float var21 = 2.0f * var11 - var19; - float var23 = var6 + 0.3333333333333333f; - if(var23 > 1.0f) { - var23 -= 1.f; - } - - float var27 = var6 - 0.3333333333333333f; - if(var27 < 0.0f) { - var27 += 1.f; - } - - if(6.0f * var23 < 1.0f) { - var13 = var21 + (var19 - var21) * 6.0f * var23; - } else if(2.0f * var23 < 1.0f) { - var13 = var19; - } else if(3.0f * var23 < 2.0f) { - var13 = var21 + (var19 - var21) * (0.6666666666666666f - var23) * 6.0f; - } else { - var13 = var21; - } - - if(6.0f * var6 < 1.0f) { - var15 = var21 + (var19 - var21) * 6.0f * var6; - } else if(2.0f * var6 < 1.0f) { - var15 = var19; - } else if(3.0f * var6 < 2.0f) { - var15 = var21 + (var19 - var21) * (0.6666666666666666f - var6) * 6.0f; - } else { - var15 = var21; - } - - if(6.0f * var27 < 1.0f) { - var17 = var21 + (var19 - var21) * 6.0f * var27; - } else if(2.0f * var27 < 1.0f) { - var17 = var19; - } else if(3.0f * var27 < 2.0f) { - var17 = var21 + (var19 - var21) * (0.6666666666666666f - var27) * 6.0f; - } else { - var17 = var21; - } - } - - vec3 rgb = vec3( - pow(var13, brightness), - pow(var15, brightness), - pow(var17, brightness) - ); - - // I don't think we actually need this - if (rgb == vec3(0, 0, 0)) { - rgb = vec3(0, 0, 1/255.f); - } - - return rgb; -} +#include hsl_to_rgb.glsl void main() { @@ -121,5 +48,6 @@ void main() vPosition = vertex; vColor = vec4(rgb, 1.f - a); + vHsl = float(hsl); vUv = uv; }