diff --git a/src/net/torvald/terrarum/gameparticles/ParticleBase.kt b/src/net/torvald/terrarum/gameparticles/ParticleBase.kt index e55fa20dc..fa29ea66d 100644 --- a/src/net/torvald/terrarum/gameparticles/ParticleBase.kt +++ b/src/net/torvald/terrarum/gameparticles/ParticleBase.kt @@ -94,6 +94,7 @@ open class ParticleBase(renderOrder: Actor.RenderOrder, var despawnUponCollision val oldColour = batch.color.cpy() if (!flagDespawn) { batch.shader = IngameRenderer.shaderBayerAlpha + batch.shader.setUniformi("frame", App.GLOBAL_RENDER_TIMER.toInt() % 16) batch.color = drawColour drawBodyInGoodPosition(hitbox.startX.toFloat(), hitbox.startY.toFloat()) { x, y -> drawJob(x, y) diff --git a/src/shaders/bayeralpha.frag b/src/shaders/bayeralpha.frag index 046ea7101..6c56ce515 100644 --- a/src/shaders/bayeralpha.frag +++ b/src/shaders/bayeralpha.frag @@ -7,10 +7,29 @@ in vec2 v_texCoords; uniform sampler2D u_texture; // world texture, has alpha value that is meaningful uniform float acount = 2.0; +uniform int frame = 0; out vec4 fragColor; const int bayer[4 * 4] = int[](0,8,2,10,12,4,14,6,3,11,1,9,15,7,13,5); +const vec2 bayerOffset[4 * 4] = vec2[]( + vec2(0,0), + vec2(3,2), + vec2(1,3), + vec2(3,0), + vec2(1,1), + vec2(2,3), + vec2(0,2), + vec2(2,1), + vec2(3,3), + vec2(1,0), + vec2(3,1), + vec2(0,3), + vec2(2,2), + vec2(0,1), + vec2(2,0), + vec2(1,2) +); const float bayerSize = 4.0; const float bayerDivider = bayerSize * bayerSize; @@ -20,7 +39,9 @@ float nearestAlpha(float alpha) { void main() { vec4 inColor = texture(u_texture, v_texCoords) * v_color; - vec2 entry = mod(gl_FragCoord.xy, vec2(bayerSize, bayerSize)); + vec2 entryOffset = bayerOffset[int(mod(frame, bayerDivider))]; + vec2 entry = mod(gl_FragCoord.xy + entryOffset, vec2(bayerSize, bayerSize)); + float alpha = nearestAlpha((inColor.a * 16.0 / 15.0) + (bayer[int(entry.y) * int(bayerSize) + int(entry.x)] / bayerDivider - 0.5));