From 13b1942d0ea5102e852673727be35f7e100a551b Mon Sep 17 00:00:00 2001 From: minjaesong Date: Mon, 18 Sep 2023 17:54:42 +0900 Subject: [PATCH] shader: auto versioning and feature selection to allow broader compatibility --- .../graphics/glutils/Float16FrameBuffer.java | 20 ++++++++-- src/net/torvald/terrarum/App.java | 38 +++++++++++-------- src/net/torvald/terrarum/ui/UIHandler.kt | 22 +++++------ src/shaders/aaaxmul.frag | 1 - src/shaders/actors.frag | 1 - src/shaders/aonly.frag | 1 - src/shaders/blendGlow.frag | 2 +- src/shaders/blendGlow.vert | 1 - src/shaders/blendSkyboxStars.frag | 2 +- src/shaders/blendSkyboxStars.vert | 1 - src/shaders/blur.frag | 1 - src/shaders/blur.vert | 1 - src/shaders/blur2.frag | 1 - src/shaders/boxdown.frag | 1 - src/shaders/boxup.frag | 1 - src/shaders/clouds.frag | 2 +- src/shaders/crt.frag | 1 - src/shaders/default.vert | 1 - src/shaders/demultiply.frag | 1 - src/shaders/diff.frag | 1 - src/shaders/float_to_disp_dither_static.frag | 2 +- src/shaders/ghastlywhite.frag | 2 +- src/shaders/gl32shaperenderer.frag | 1 - src/shaders/gl32shaperenderer.vert | 1 - src/shaders/gl32spritebatch.frag | 1 - src/shaders/gl32spritebatch.vert | 1 - src/shaders/hicolour.frag | 1 - src/shaders/hq2x.vert | 1 - src/shaders/kawasedown.frag | 1 - src/shaders/kawaseup.frag | 1 - src/shaders/loadingCircle.frag | 1 - src/shaders/postproc_dither.frag | 2 +- src/shaders/postproc_nodither.frag | 2 +- src/shaders/quickgreyscale.frag | 1 - src/shaders/quickgreyscale.vert | 1 - src/shaders/reflect.frag | 1 - src/shaders/rgbonly.frag | 1 - src/shaders/rgbxmul.frag | 1 - src/shaders/skyboxfill.frag | 1 - src/shaders/tiling.frag | 2 +- src/shaders/tiling_dither.frag | 2 - src/shaders/vibrancy.frag | 2 +- src/shaders/ycocg_grading.frag | 1 - 43 files changed, 58 insertions(+), 72 deletions(-) diff --git a/src/com/badlogic/gdx/graphics/glutils/Float16FrameBuffer.java b/src/com/badlogic/gdx/graphics/glutils/Float16FrameBuffer.java index 14161e2c5..19b1be7f6 100644 --- a/src/com/badlogic/gdx/graphics/glutils/Float16FrameBuffer.java +++ b/src/com/badlogic/gdx/graphics/glutils/Float16FrameBuffer.java @@ -33,7 +33,7 @@ public class Float16FrameBuffer extends FrameBuffer { * @param hasDepth whether to attach a depth buffer * @throws GdxRuntimeException in case the FrameBuffer could not be created */ public Float16FrameBuffer (int width, int height, boolean hasDepth) { - if (App.operationSystem.equals("OSX")) { // disable float framebuffer for Apple M chips + /*if (!App.gl40capable || App.operationSystem.equals("OSX")) { // disable float framebuffer for Apple M chips FrameBufferBuilder bufferBuilder = new FrameBufferBuilder(width, height); bufferBuilder.addColorTextureAttachment(GL20.GL_RGBA, GL20.GL_RGBA, GL20.GL_UNSIGNED_SHORT); // but 16bpp int works perfectly?! if (hasDepth) bufferBuilder.addBasicDepthRenderBuffer(); @@ -44,14 +44,19 @@ public class Float16FrameBuffer extends FrameBuffer { bufferBuilder.addFloatAttachment(GL30.GL_RGBA16F, GL30.GL_RGBA, GL30.GL_FLOAT, false); if (hasDepth) bufferBuilder.addBasicDepthRenderBuffer(); this.bufferBuilder = bufferBuilder; - } + }*/ + + FrameBufferBuilder bufferBuilder = new FrameBufferBuilder(width, height); + bufferBuilder.addColorTextureAttachment(GL20.GL_RGBA, GL20.GL_RGBA, GL20.GL_UNSIGNED_SHORT); // but 16bpp int works perfectly?! + if (hasDepth) bufferBuilder.addBasicDepthRenderBuffer(); + this.bufferBuilder = bufferBuilder; build(); } @Override protected Texture createTexture (FrameBufferTextureAttachmentSpec attachmentSpec) { - if (App.operationSystem.equals("OSX")) { + /*if (!App.gl40capable || App.operationSystem.equals("OSX")) { GLOnlyTextureData data = new GLOnlyTextureData(bufferBuilder.width, bufferBuilder.height, 0, attachmentSpec.internalFormat, attachmentSpec.format, attachmentSpec.type); Texture result = new Texture(data); @@ -66,7 +71,14 @@ public class Float16FrameBuffer extends FrameBuffer { result.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); result.setWrap(Texture.TextureWrap.ClampToEdge, Texture.TextureWrap.ClampToEdge); return result; - } + }*/ + + GLOnlyTextureData data = new GLOnlyTextureData(bufferBuilder.width, bufferBuilder.height, 0, attachmentSpec.internalFormat, + attachmentSpec.format, attachmentSpec.type); + Texture result = new Texture(data); + result.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); + result.setWrap(Texture.TextureWrap.ClampToEdge, Texture.TextureWrap.ClampToEdge); + return result; } } diff --git a/src/net/torvald/terrarum/App.java b/src/net/torvald/terrarum/App.java index 31902db10..d9bd7940f 100644 --- a/src/net/torvald/terrarum/App.java +++ b/src/net/torvald/terrarum/App.java @@ -32,6 +32,7 @@ import net.torvald.terrarum.langpack.Lang; import net.torvald.terrarum.modulebasegame.IngameRenderer; import net.torvald.terrarum.modulebasegame.TerrarumIngame; import net.torvald.terrarum.modulebasegame.ui.ItemSlotImageFactory; +import net.torvald.terrarum.serialise.Common; import net.torvald.terrarum.serialise.WriteConfig; import net.torvald.terrarum.ui.Toolkit; import net.torvald.terrarum.utils.JsonFetcher; @@ -330,6 +331,8 @@ public class App implements ApplicationListener { return new ShapeRenderer(5000, DefaultGL32Shaders.INSTANCE.createShapeRendererShader()); } + public static boolean gl40capable = false; + public static void main(String[] args) { long st = System.nanoTime(); @@ -473,6 +476,8 @@ public class App implements ApplicationListener { glInfo.create(); + gl40capable = (Gdx.graphics.getGLVersion().getMajorVersion() >= 4); + printdbg(this, "GL40 capable? "+gl40capable); CommonResourcePool.INSTANCE.addToLoadingList("title_health1", () -> new Texture(Gdx.files.internal("./assets/graphics/gui/health_take_a_break.tga"))); CommonResourcePool.INSTANCE.addToLoadingList("title_health2", () -> new Texture(Gdx.files.internal("./assets/graphics/gui/health_distance.tga"))); @@ -1613,26 +1618,29 @@ public class App implements ApplicationListener { } public static ShaderProgram loadShaderFromClasspath(String vert, String frag) { - ShaderProgram s = new ShaderProgram(Gdx.files.classpath(vert), Gdx.files.classpath(frag)); - - if (s.getLog().toLowerCase().contains("error")) { - throw new Error(String.format("Shader program loaded with %s, %s failed:\n%s", vert, frag, s.getLog())); - } - - return s; + String v = Gdx.files.classpath(vert).readString("utf-8"); + String f = Gdx.files.classpath(frag).readString("utf-8"); + return loadShaderInline(v, f); } public static ShaderProgram loadShaderFromFile(String vert, String frag) { - ShaderProgram s = new ShaderProgram(Gdx.files.internal(vert), Gdx.files.internal(frag)); - - if (s.getLog().toLowerCase().contains("error")) { - throw new Error(String.format("Shader program loaded with %s, %s failed:\n%s", vert, frag, s.getLog())); - } - - return s; + String v = Gdx.files.internal(vert).readString("utf-8"); + String f = Gdx.files.internal(frag).readString("utf-8"); + return loadShaderInline(v, f); } - public static ShaderProgram loadShaderInline(String vert, String frag) { + public static ShaderProgram loadShaderInline(String vert0, String frag0) { + // insert version code + String vert, frag; + if (gl40capable) { + vert = "#version 400\n"+vert0; + frag = "#version 400\n"+frag0; + } + else { + vert = "#version 150\n#define fma(a,b,c) ((a*b)+c)\n"+vert0; + frag = "#version 150\n#define fma(a,b,c) ((a*b)+c)\n"+frag0; + } + ShaderProgram s = new ShaderProgram(vert, frag); if (s.getLog().toLowerCase().contains("error")) { diff --git a/src/net/torvald/terrarum/ui/UIHandler.kt b/src/net/torvald/terrarum/ui/UIHandler.kt index 4ff81814f..085d9f568 100644 --- a/src/net/torvald/terrarum/ui/UIHandler.kt +++ b/src/net/torvald/terrarum/ui/UIHandler.kt @@ -35,45 +35,43 @@ class UIHandler(//var UI: UICanvas, companion object { private val SHADER_PROG_FRAG = """ -#version 150 #ifdef GL_ES - precision mediump float; +precision mediump float; #endif in vec4 v_color; +in vec4 v_generic; in vec2 v_texCoords; -uniform sampler2D u_texture; - uniform float opacity; - +uniform sampler2D u_texture; out vec4 fragColor; +const vec2 boolean = vec2(0.0, 1.0); -void main(void) { - vec4 color = texture(u_texture, v_texCoords).rgba; - +void main() { + vec4 color = texture(u_texture, v_texCoords); fragColor = v_color * vec4(color.rgb, color.a * opacity); } """.trimIndent() private val SHADER_PROG_VERT = """ -#version 150 - in vec4 a_position; in vec4 a_color; +in vec4 a_generic; in vec2 a_texCoord0; uniform mat4 u_projTrans; out vec4 v_color; out vec2 v_texCoords; +out vec4 v_generic; void main() { v_color = a_color; - v_color.a = v_color.a * (255.0/254.0); v_texCoords = a_texCoord0; + v_generic = a_generic; gl_Position = u_projTrans * a_position; } - """.trimIndent() +""".trimIndent() } // X/Y Position relative to the game window. diff --git a/src/shaders/aaaxmul.frag b/src/shaders/aaaxmul.frag index 0c786aa25..fece8f6aa 100644 --- a/src/shaders/aaaxmul.frag +++ b/src/shaders/aaaxmul.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/actors.frag b/src/shaders/actors.frag index fd02ccd99..02579f7c4 100644 --- a/src/shaders/actors.frag +++ b/src/shaders/actors.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/aonly.frag b/src/shaders/aonly.frag index d42e55ffb..599b32567 100644 --- a/src/shaders/aonly.frag +++ b/src/shaders/aonly.frag @@ -1,4 +1,3 @@ -#version 150 in vec4 v_color; in vec2 v_texCoords; diff --git a/src/shaders/blendGlow.frag b/src/shaders/blendGlow.frag index a84351850..c36c7634f 100644 --- a/src/shaders/blendGlow.frag +++ b/src/shaders/blendGlow.frag @@ -1,4 +1,4 @@ -#version 400 + #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/blendGlow.vert b/src/shaders/blendGlow.vert index 84b21a8d8..a7947b55e 100644 --- a/src/shaders/blendGlow.vert +++ b/src/shaders/blendGlow.vert @@ -1,4 +1,3 @@ -#version 150 in vec4 a_position; in vec4 a_color; diff --git a/src/shaders/blendSkyboxStars.frag b/src/shaders/blendSkyboxStars.frag index 2a4880b59..dd1b15bdb 100644 --- a/src/shaders/blendSkyboxStars.frag +++ b/src/shaders/blendSkyboxStars.frag @@ -1,4 +1,4 @@ -#version 400 + #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/blendSkyboxStars.vert b/src/shaders/blendSkyboxStars.vert index 84b21a8d8..a7947b55e 100644 --- a/src/shaders/blendSkyboxStars.vert +++ b/src/shaders/blendSkyboxStars.vert @@ -1,4 +1,3 @@ -#version 150 in vec4 a_position; in vec4 a_color; diff --git a/src/shaders/blur.frag b/src/shaders/blur.frag index 76a7e7f0f..23000f6c3 100644 --- a/src/shaders/blur.frag +++ b/src/shaders/blur.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/blur.vert b/src/shaders/blur.vert index b899fbcdc..3afc0be54 100644 --- a/src/shaders/blur.vert +++ b/src/shaders/blur.vert @@ -1,4 +1,3 @@ -#version 150 in vec4 a_position; in vec4 a_color; diff --git a/src/shaders/blur2.frag b/src/shaders/blur2.frag index 11902e0e1..0e6529677 100644 --- a/src/shaders/blur2.frag +++ b/src/shaders/blur2.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/boxdown.frag b/src/shaders/boxdown.frag index 701e4d528..48746f4c8 100644 --- a/src/shaders/boxdown.frag +++ b/src/shaders/boxdown.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/boxup.frag b/src/shaders/boxup.frag index 29725d7c5..754b0b800 100644 --- a/src/shaders/boxup.frag +++ b/src/shaders/boxup.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/clouds.frag b/src/shaders/clouds.frag index 50bedf6cc..fc1a1e8d2 100644 --- a/src/shaders/clouds.frag +++ b/src/shaders/clouds.frag @@ -1,4 +1,4 @@ -#version 400 + in vec4 v_color; // lightCol diff --git a/src/shaders/crt.frag b/src/shaders/crt.frag index 6ab432b26..cee836810 100644 --- a/src/shaders/crt.frag +++ b/src/shaders/crt.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/default.vert b/src/shaders/default.vert index 72733ceed..d36736135 100644 --- a/src/shaders/default.vert +++ b/src/shaders/default.vert @@ -1,4 +1,3 @@ -#version 150 in vec4 a_position; in vec4 a_color; diff --git a/src/shaders/demultiply.frag b/src/shaders/demultiply.frag index 9de2587ec..7443261db 100644 --- a/src/shaders/demultiply.frag +++ b/src/shaders/demultiply.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/diff.frag b/src/shaders/diff.frag index 9bca23eaa..e8cf19da5 100644 --- a/src/shaders/diff.frag +++ b/src/shaders/diff.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/float_to_disp_dither_static.frag b/src/shaders/float_to_disp_dither_static.frag index aceb8aca2..b8e3f9aaa 100644 --- a/src/shaders/float_to_disp_dither_static.frag +++ b/src/shaders/float_to_disp_dither_static.frag @@ -1,4 +1,4 @@ -#version 400 + #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/ghastlywhite.frag b/src/shaders/ghastlywhite.frag index 2e4ee91dd..652d643cb 100644 --- a/src/shaders/ghastlywhite.frag +++ b/src/shaders/ghastlywhite.frag @@ -1,4 +1,4 @@ -#version 400 + in vec4 v_color; in vec2 v_texCoords; uniform sampler2D u_texture; diff --git a/src/shaders/gl32shaperenderer.frag b/src/shaders/gl32shaperenderer.frag index b5ec75c62..6362a2ea6 100644 --- a/src/shaders/gl32shaperenderer.frag +++ b/src/shaders/gl32shaperenderer.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; diff --git a/src/shaders/gl32shaperenderer.vert b/src/shaders/gl32shaperenderer.vert index 2f417134d..5fbd791cd 100644 --- a/src/shaders/gl32shaperenderer.vert +++ b/src/shaders/gl32shaperenderer.vert @@ -1,4 +1,3 @@ -#version 150 in vec4 a_position; in vec4 a_color; diff --git a/src/shaders/gl32spritebatch.frag b/src/shaders/gl32spritebatch.frag index 0c7dd2d3a..6cbd278f5 100644 --- a/src/shaders/gl32spritebatch.frag +++ b/src/shaders/gl32spritebatch.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; diff --git a/src/shaders/gl32spritebatch.vert b/src/shaders/gl32spritebatch.vert index 72733ceed..d36736135 100644 --- a/src/shaders/gl32spritebatch.vert +++ b/src/shaders/gl32spritebatch.vert @@ -1,4 +1,3 @@ -#version 150 in vec4 a_position; in vec4 a_color; diff --git a/src/shaders/hicolour.frag b/src/shaders/hicolour.frag index 1bfdb82f9..e4afabeb9 100644 --- a/src/shaders/hicolour.frag +++ b/src/shaders/hicolour.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/hq2x.vert b/src/shaders/hq2x.vert index 64fd28d1d..ee6072159 100644 --- a/src/shaders/hq2x.vert +++ b/src/shaders/hq2x.vert @@ -1,5 +1,4 @@ #version 150 - in vec4 a_position; in vec2 a_texCoord0; diff --git a/src/shaders/kawasedown.frag b/src/shaders/kawasedown.frag index d93490cfa..33dd01ee0 100644 --- a/src/shaders/kawasedown.frag +++ b/src/shaders/kawasedown.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/kawaseup.frag b/src/shaders/kawaseup.frag index dbfe34b42..951425ab9 100644 --- a/src/shaders/kawaseup.frag +++ b/src/shaders/kawaseup.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/loadingCircle.frag b/src/shaders/loadingCircle.frag index 6b528724e..01e71f435 100644 --- a/src/shaders/loadingCircle.frag +++ b/src/shaders/loadingCircle.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/postproc_dither.frag b/src/shaders/postproc_dither.frag index e520dd139..55104c927 100644 --- a/src/shaders/postproc_dither.frag +++ b/src/shaders/postproc_dither.frag @@ -3,7 +3,7 @@ * http://momentsingraphics.de/BlueNoise.html */ -#version 400 + #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/postproc_nodither.frag b/src/shaders/postproc_nodither.frag index e62c9a504..f78cabf5f 100644 --- a/src/shaders/postproc_nodither.frag +++ b/src/shaders/postproc_nodither.frag @@ -3,7 +3,7 @@ * http://momentsingraphics.de/BlueNoise.html */ -#version 400 + #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/quickgreyscale.frag b/src/shaders/quickgreyscale.frag index 71deada66..a70f649a3 100644 --- a/src/shaders/quickgreyscale.frag +++ b/src/shaders/quickgreyscale.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/quickgreyscale.vert b/src/shaders/quickgreyscale.vert index 09430c19a..dfb04f506 100644 --- a/src/shaders/quickgreyscale.vert +++ b/src/shaders/quickgreyscale.vert @@ -1,4 +1,3 @@ -#version 150 in vec4 a_position; in vec4 a_color; diff --git a/src/shaders/reflect.frag b/src/shaders/reflect.frag index a6dc858cd..efc5801ba 100644 --- a/src/shaders/reflect.frag +++ b/src/shaders/reflect.frag @@ -1,4 +1,3 @@ -#version 150 in vec4 v_color; in vec2 v_texCoords; uniform sampler2D u_texture; diff --git a/src/shaders/rgbonly.frag b/src/shaders/rgbonly.frag index db9af19bd..0cafc4ef6 100644 --- a/src/shaders/rgbonly.frag +++ b/src/shaders/rgbonly.frag @@ -1,4 +1,3 @@ -#version 150 in vec4 v_color; in vec2 v_texCoords; uniform sampler2D u_texture; diff --git a/src/shaders/rgbxmul.frag b/src/shaders/rgbxmul.frag index 15c3a9a3a..08cceb5a7 100644 --- a/src/shaders/rgbxmul.frag +++ b/src/shaders/rgbxmul.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/skyboxfill.frag b/src/shaders/skyboxfill.frag index 80eac0066..c0976e75d 100644 --- a/src/shaders/skyboxfill.frag +++ b/src/shaders/skyboxfill.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/tiling.frag b/src/shaders/tiling.frag index 4470f7398..52ecb52b2 100644 --- a/src/shaders/tiling.frag +++ b/src/shaders/tiling.frag @@ -2,7 +2,7 @@ */ -#version 400 + #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/tiling_dither.frag b/src/shaders/tiling_dither.frag index 6f45c4458..1494d87c7 100644 --- a/src/shaders/tiling_dither.frag +++ b/src/shaders/tiling_dither.frag @@ -1,8 +1,6 @@ /* -*/ -#version 400 #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/vibrancy.frag b/src/shaders/vibrancy.frag index 8c2da0646..4bab4c1fa 100644 --- a/src/shaders/vibrancy.frag +++ b/src/shaders/vibrancy.frag @@ -1,4 +1,4 @@ -#version 400 + #ifdef GL_ES precision mediump float; #endif diff --git a/src/shaders/ycocg_grading.frag b/src/shaders/ycocg_grading.frag index 5259d6d2c..4085e27c1 100644 --- a/src/shaders/ycocg_grading.frag +++ b/src/shaders/ycocg_grading.frag @@ -1,4 +1,3 @@ -#version 150 #ifdef GL_ES precision mediump float; #endif