shader preloading

This commit is contained in:
minjaesong
2024-12-16 19:36:58 +09:00
parent 3322878074
commit fe4318877a
9 changed files with 92 additions and 57 deletions

View File

@@ -590,6 +590,8 @@ public class App implements ApplicationListener {
gl40capable = (Gdx.graphics.getGLVersion().getMajorVersion() >= 4);
printdbg(this, "GL40 capable? "+gl40capable);
ShaderMgr.INSTANCE.compile(Gdx.files.classpath("shaders/shaders.csv"));
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")));
CommonResourcePool.INSTANCE.addToLoadingList("sound:haptic_bup", () -> new MusicContainer("haptic_bup", Gdx.files.internal("./assets/audio/effects/haptic_bup.ogg").file(), false, true, (AudioBank m) -> { return null; }));
@@ -1002,6 +1004,7 @@ public class App implements ApplicationListener {
shaderGhastlyWhite.dispose();
hq2x.dispose();
ShaderMgr.INSTANCE.dispose();
CommonResourcePool.INSTANCE.dispose();
fullscreenQuad.dispose();
logoBatch.dispose();

View File

@@ -0,0 +1,38 @@
package net.torvald.terrarum
import com.badlogic.gdx.files.FileHandle
import com.badlogic.gdx.graphics.glutils.ShaderProgram
import com.badlogic.gdx.utils.Disposable
import net.torvald.terrarum.utils.CSVFetcher
/**
* `default`, `default-batch`, and `default-shaperenderer` is pre-allocated. `default` is identical to `default-batch`.
*
* Created by minjaesong on 2024-12-16.
*/
object ShaderMgr : Disposable {
private val mapping = HashMap<String, ShaderProgram>()
fun compile(path: FileHandle) {
CSVFetcher.readFromString(path.readString("utf-8")).forEach {
val vert = it["vert"]
val frag = it["frag"]
val name = it["name"]
mapping[name] = App.loadShaderFromClasspath("shaders/$vert", "shaders/$frag")
}
mapping["default"] = DefaultGL32Shaders.createSpriteBatchShader()
mapping["default-batch"] = DefaultGL32Shaders.createSpriteBatchShader()
mapping["default-shaperenderer"] = DefaultGL32Shaders.createShapeRendererShader()
}
operator fun get(name: String): ShaderProgram = mapping[name]!!
override fun dispose() {
mapping.values.forEach { it.dispose() }
}
}

View File

@@ -52,8 +52,8 @@ object TerrarumPostProcessor : Disposable {
private val batteryTex = TextureRegionPack(Gdx.files.internal("assets/graphics/gui/fullscreen_bat_ind.tga"), 23, 14)
private val shaderPostDither = App.loadShaderFromClasspath("shaders/default.vert", "shaders/postproc_dither.frag")
private val shaderPostNoDither = App.loadShaderFromClasspath("shaders/default.vert", "shaders/postproc_nodither.frag")
private val shaderPostDither = ShaderMgr["postDither"]
private val shaderPostNoDither = ShaderMgr["postNoDither"]
private val recommendRatio = 1.5f
@@ -83,8 +83,6 @@ object TerrarumPostProcessor : Disposable {
batch.dispose()
shapeRenderer.dispose()
functionRowHelper.dispose()
shaderPostDither.dispose()
shaderPostNoDither.dispose()
if (::lutTex.isInitialized) lutTex.tryDispose()
if (::outFBO.isInitialized) outFBO.dispose()
// testfill.dispose()

View File

@@ -154,24 +154,24 @@ object IngameRenderer : Disposable {
// these codes will run regardless of the invocation of the "initialise()" function
// the "initialise()" function will also be called
init {
shaderBlur = App.loadShaderFromClasspath("shaders/blur.vert", "shaders/blur.frag")
shaderRGBOnly = App.loadShaderFromClasspath("shaders/default.vert", "shaders/rgbonly.frag")
shaderAtoGrey = App.loadShaderFromClasspath("shaders/default.vert", "shaders/aonly.frag")
shaderBlur = ShaderMgr["irBlur"]
shaderRGBOnly = ShaderMgr["irRGBOnly"]
shaderAtoGrey = ShaderMgr["irAtoGrey"]
shaderForActors = App.loadShaderFromClasspath("shaders/default.vert", "shaders/actors.frag")
shaderShadowShallow = App.loadShaderFromClasspath("shaders/default.vert", "shaders/shadowshallow.frag")
shaderShadowDeep = App.loadShaderFromClasspath("shaders/default.vert", "shaders/shadowdeep.frag")
shaderBlendGlow = App.loadShaderFromClasspath("shaders/blendGlow.vert", "shaders/blendGlow.frag")
shaderBlendGlowTex1Flip = App.loadShaderFromClasspath("shaders/blendGlow.vert", "shaders/blendGlowTex1Flip.frag")
shaderDemultiply = App.loadShaderFromClasspath("shaders/blendGlow.vert", "shaders/demultiply.frag")
shaderForActors = ShaderMgr["irForActors"]
shaderShadowShallow = ShaderMgr["irShadowShallow"]
shaderShadowDeep = ShaderMgr["irShadowDeep"]
shaderBlendGlow = ShaderMgr["irBlendGlow"]
shaderBlendGlowTex1Flip = ShaderMgr["irBlendGlowTex1Flip"]
shaderDemultiply = ShaderMgr["irDemultiply"]
shaderBayerAlpha = App.loadShaderFromClasspath("shaders/default.vert", "shaders/alphadither.frag")
shaderBayerAlpha = ShaderMgr["irBayerAlpha"]
shaderKawaseDown = App.loadShaderFromClasspath("shaders/default.vert", "shaders/kawasedown.frag")
shaderKawaseUp = App.loadShaderFromClasspath("shaders/default.vert", "shaders/kawaseup.frag")
shaderKawaseDown = ShaderMgr["irKawaseDown"]
shaderKawaseUp = ShaderMgr["irKawaseUp"]
shaderVibrancy = App.loadShaderFromClasspath("shaders/default.vert", "shaders/vibrancy.frag")
shaderVibrancy = ShaderMgr["irVibrancy"]
if (!shaderBlendGlow.isCompiled) {
Gdx.app.log("shaderBlendGlow", shaderBlendGlow.log)
@@ -1403,26 +1403,6 @@ object IngameRenderer : Disposable {
WeatherMixer.dispose()
if (::batch.isInitialized) batch.tryDispose()
shaderBlur.dispose()
shaderRGBOnly.dispose()
shaderAtoGrey.dispose()
shaderKawaseDown.dispose()
shaderKawaseUp.dispose()
shaderBlendGlow.dispose()
shaderBlendGlowTex1Flip.dispose()
shaderForActors.dispose()
shaderShadowShallow.dispose()
shaderShadowDeep.dispose()
shaderDemultiply.dispose()
shaderBayerAlpha.dispose()
shaderVibrancy.dispose()
if (::fboRGBexport.isInitialized) fboRGBexport.tryDispose()
}

View File

@@ -5,10 +5,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.glutils.Float16FrameBuffer
import com.badlogic.gdx.graphics.glutils.FrameBuffer
import com.jme3.math.FastMath
import net.torvald.terrarum.App
import net.torvald.terrarum.ceilToInt
import net.torvald.terrarum.gdxClearAndEnableBlend
import net.torvald.terrarum.inAction
import net.torvald.terrarum.*
/**
* Created by minjaesong on 2024-11-23.
@@ -84,9 +81,9 @@ object BlurMgr {
private lateinit var blurtex2: Texture
private lateinit var blurtex3: Texture
private val shaderKawaseDown = App.loadShaderFromClasspath("shaders/default.vert", "shaders/kawasedown.frag")
private val shaderKawaseUp = App.loadShaderFromClasspath("shaders/default.vert", "shaders/kawaseup.frag")
private val shaderGauss3 = App.loadShaderFromClasspath("shaders/default.vert", "shaders/gaussian3x3.frag")
private val shaderKawaseDown = ShaderMgr["irKawaseDown"]
private val shaderKawaseUp = ShaderMgr["irKawaseUp"]
private val shaderGauss3 = ShaderMgr["gaus3"]
fun makeBlur(`in`: FrameBuffer, out: FrameBuffer, strength: Float) {
assert(`in`.width == out.width && `in`.height == out.height) {
@@ -198,9 +195,6 @@ object BlurMgr {
fun dispose() {
fboDict.values.forEach { it.dispose() }
shaderKawaseUp.dispose()
shaderKawaseDown.dispose()
shaderGauss3.dispose()
}
}

View File

@@ -184,8 +184,8 @@ object Toolkit : Disposable {
Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0) // so that batch that comes next will bind any tex to it
batch.begin()
batch.shader = null
batch.begin()
(batch as FlippingSpriteBatch).drawFlipped(fboBlur.colorBufferTexture, x.toFloat(), y.toFloat())
}

View File

@@ -102,9 +102,8 @@ internal object WeatherMixer : RNGConsumer {
it.texture.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat)
}
private val shaderAstrum =
App.loadShaderFromClasspath("shaders/blendSkyboxStars.vert", "shaders/blendSkyboxStars.frag")
private val shaderClouds = App.loadShaderFromClasspath("shaders/default.vert", "shaders/clouds.frag")
private val shaderAstrum = ShaderMgr["astrum"]
private val shaderClouds = ShaderMgr["clouds"]
private var astrumOffX = 0f
private var astrumOffY = 0f
@@ -891,8 +890,6 @@ internal object WeatherMixer : RNGConsumer {
fun dispose() {
starmapTex.texture.dispose()
shaderAstrum.dispose()
shaderClouds.dispose()
}
private fun Cvec.linearise(): Cvec {

View File

@@ -110,8 +110,8 @@ internal object BlocksDrawer {
private var nullBuffer: Pixmap = Pixmap(1, 1, Pixmap.Format.RGBA8888)
private lateinit var tilesQuad: Mesh
private val shaderTiling = App.loadShaderFromClasspath("shaders/default.vert", "shaders/tiling.frag")
private val shaderDeblock = App.loadShaderFromClasspath("shaders/default.vert", "shaders/deblocking.frag")
private val shaderTiling = ShaderMgr["tiling"]
private val shaderDeblock = ShaderMgr["deblock"]
private lateinit var deblockingFBO: Float16FrameBuffer
private lateinit var blurmapFBO: Float16FrameBuffer
@@ -1493,8 +1493,6 @@ internal object BlocksDrawer {
_tilesBufferAsTex2.dispose()
// _blurTilesBuffer.dispose()
tilesQuad.tryDispose()
shaderTiling.dispose()
shaderDeblock.dispose()
nullTex.dispose()
nullBuffer.dispose()

27
src/shaders/shaders.csv Normal file
View File

@@ -0,0 +1,27 @@
name;frag;vert;comment
astrum;blendSkyboxStars.frag;blendSkyboxStars.vert;WeatherMixer
clouds;clouds.frag;default.vert;WeatherMixer
tiling;tiling.frag;default.vert;BlocksDrawer
deblock;deblocking.frag;default.vert;BlocksDrawer
postDither;postproc_dither.frag;default.vert;TerrarumPostProcessor
postNoDither;postproc_nodither.frag;default.vert;TerrarumPostProcessor
irBlur;blur.frag;blur.vert;IngameRenderer
irRGBOnly;rgbonly.frag;default.vert;IngameRenderer
irAtoGrey;aonly.frag;default.vert;IngameRenderer
irForActors;actors.frag;default.vert;IngameRenderer
irShadowShallow;shadowshallow.frag;default.vert;IngameRenderer
irShadowDeep;shadowdeep.frag;default.vert;IngameRenderer
irBlendGlow;blendGlow.frag;default.vert;IngameRenderer
irBlendGlowTex1Flip;blendGlowTex1Flip.frag;default.vert;IngameRenderer
irDemultiply;demultiply.frag;default.vert;IngameRenderer
irBayerAlpha;alphadither.frag;default.vert;IngameRenderer
irKawaseDown;kawasedown.frag;default.vert;IngameRenderer
irKawaseUp;kawaseup.frag;default.vert;IngameRenderer
irVibrancy;vibrancy.frag;default.vert;IngameRenderer
gaus3;gaussian3x3.frag;default.vert;BlurMgr
1 name frag vert comment
2 astrum blendSkyboxStars.frag blendSkyboxStars.vert WeatherMixer
3 clouds clouds.frag default.vert WeatherMixer
4 tiling tiling.frag default.vert BlocksDrawer
5 deblock deblocking.frag default.vert BlocksDrawer
6 postDither postproc_dither.frag default.vert TerrarumPostProcessor
7 postNoDither postproc_nodither.frag default.vert TerrarumPostProcessor
8 irBlur blur.frag blur.vert IngameRenderer
9 irRGBOnly rgbonly.frag default.vert IngameRenderer
10 irAtoGrey aonly.frag default.vert IngameRenderer
11 irForActors actors.frag default.vert IngameRenderer
12 irShadowShallow shadowshallow.frag default.vert IngameRenderer
13 irShadowDeep shadowdeep.frag default.vert IngameRenderer
14 irBlendGlow blendGlow.frag default.vert IngameRenderer
15 irBlendGlowTex1Flip blendGlowTex1Flip.frag default.vert IngameRenderer
16 irDemultiply demultiply.frag default.vert IngameRenderer
17 irBayerAlpha alphadither.frag default.vert IngameRenderer
18 irKawaseDown kawasedown.frag default.vert IngameRenderer
19 irKawaseUp kawaseup.frag default.vert IngameRenderer
20 irVibrancy vibrancy.frag default.vert IngameRenderer
21 gaus3 gaussian3x3.frag default.vert BlurMgr