mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-10 02:24:05 +09:00
blur shader works
This commit is contained in:
@@ -1,12 +1,31 @@
|
|||||||
#ifdef GL_ES
|
|
||||||
precision mediump float;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
varying vec4 v_color;
|
varying vec4 v_color;
|
||||||
varying vec2 v_texCoords;
|
varying vec2 v_texCoords;
|
||||||
uniform sampler2D u_texture;
|
uniform sampler2D u_texture;
|
||||||
|
|
||||||
void main() {
|
|
||||||
//gl_FragColor = v_color * texture2D(u_texture, v_texCoords);
|
|
||||||
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
|
uniform vec3 iResolution;
|
||||||
|
uniform float flip;
|
||||||
|
uniform vec2 direction;
|
||||||
|
|
||||||
|
vec4 blur(sampler2D image, vec2 uv, vec2 resolution, vec2 direction) {
|
||||||
|
vec4 color = vec4(0.0);
|
||||||
|
vec2 off1 = vec2(1.3846153846) * direction;
|
||||||
|
vec2 off2 = vec2(3.2307692308) * direction;
|
||||||
|
color += texture2D(image, uv) * 0.2270270270;
|
||||||
|
color += texture2D(image, uv + (off1 / resolution)) * 0.3162162162;
|
||||||
|
color += texture2D(image, uv - (off1 / resolution)) * 0.3162162162;
|
||||||
|
color += texture2D(image, uv + (off2 / resolution)) * 0.0702702703;
|
||||||
|
color += texture2D(image, uv - (off2 / resolution)) * 0.0702702703;
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vec2(gl_FragCoord.xy / iResolution.xy);
|
||||||
|
if (flip == 1.0) {
|
||||||
|
uv.y = 1.0 - uv.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
gl_FragColor = blur(u_texture, uv, iResolution.xy, direction);
|
||||||
}
|
}
|
||||||
@@ -4,12 +4,17 @@ import com.badlogic.gdx.ApplicationAdapter
|
|||||||
import com.badlogic.gdx.Gdx
|
import com.badlogic.gdx.Gdx
|
||||||
import com.badlogic.gdx.backends.lwjgl.LwjglApplication
|
import com.badlogic.gdx.backends.lwjgl.LwjglApplication
|
||||||
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration
|
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration
|
||||||
import com.badlogic.gdx.graphics.Color
|
|
||||||
import com.badlogic.gdx.graphics.GL20
|
import com.badlogic.gdx.graphics.GL20
|
||||||
|
import com.badlogic.gdx.graphics.Pixmap
|
||||||
import com.badlogic.gdx.graphics.Texture
|
import com.badlogic.gdx.graphics.Texture
|
||||||
import com.badlogic.gdx.graphics.g2d.BitmapFont
|
import com.badlogic.gdx.graphics.g2d.BitmapFont
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||||
|
import com.badlogic.gdx.graphics.glutils.FrameBuffer
|
||||||
|
import com.badlogic.gdx.graphics.glutils.ShaderProgram
|
||||||
import net.torvald.terrarumsansbitmap.gdx.GameFontBase
|
import net.torvald.terrarumsansbitmap.gdx.GameFontBase
|
||||||
|
import com.badlogic.gdx.graphics.OrthographicCamera
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -22,6 +27,13 @@ class TestTestTest : ApplicationAdapter() {
|
|||||||
|
|
||||||
lateinit var gameFont: BitmapFont
|
lateinit var gameFont: BitmapFont
|
||||||
|
|
||||||
|
lateinit var blurShader: ShaderProgram
|
||||||
|
|
||||||
|
lateinit var blurFboA: FrameBuffer
|
||||||
|
lateinit var blurFboB: FrameBuffer
|
||||||
|
|
||||||
|
lateinit var cam: OrthographicCamera
|
||||||
|
|
||||||
override fun create() {
|
override fun create() {
|
||||||
batch = SpriteBatch()
|
batch = SpriteBatch()
|
||||||
img = Texture("assets/test_texture.tga")
|
img = Texture("assets/test_texture.tga")
|
||||||
@@ -29,59 +41,89 @@ class TestTestTest : ApplicationAdapter() {
|
|||||||
gameFont = GameFontBase("assets/graphics/fonts/terrarum-sans-bitmap")
|
gameFont = GameFontBase("assets/graphics/fonts/terrarum-sans-bitmap")
|
||||||
//gameFont = BitmapFont()
|
//gameFont = BitmapFont()
|
||||||
|
|
||||||
|
|
||||||
|
blurFboA = FrameBuffer(Pixmap.Format.RGBA8888, img.width, img.height, false)
|
||||||
|
blurFboB = FrameBuffer(Pixmap.Format.RGBA8888, img.width, img.height, false)
|
||||||
|
|
||||||
|
ShaderProgram.pedantic = false
|
||||||
|
blurShader = ShaderProgram(Gdx.files.internal("assets/blur.vert"), Gdx.files.internal("assets/blur.frag"))
|
||||||
|
|
||||||
|
blurShader.begin()
|
||||||
|
blurShader.setUniformf("iResolution", img.width.toFloat(), img.height.toFloat(), 0f)
|
||||||
|
blurShader.end()
|
||||||
|
|
||||||
|
|
||||||
|
cam = OrthographicCamera(Gdx.graphics.width.toFloat(), Gdx.graphics.height.toFloat())
|
||||||
|
cam.setToOrtho(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
val text = arrayOf(
|
|
||||||
"x64またはx86-64とは、x86アーキテクチャを64ビットに拡張した命令セットアーキテクチャ。",
|
|
||||||
"実際には、AMDが発表したAMD64命令セット、続けてインテルが採用したIntel 64命令セット (かつてIA-32eまたはEM64Tと呼ばれていた)",
|
|
||||||
"などを含む、各社のAMD64互換命令セットの総称である。x86命令セットと互換性を持っていることから、広義にはx86にx64を含む場合がある。",
|
|
||||||
"",
|
|
||||||
"x86-64는 x86 명령어 집합 아키텍처의 64비트 모임이다. x86-64 명령어 집합은 에뮬레이션 없이 인텔의 x86를 지원하며 AMD64로 이름 붙인",
|
|
||||||
"AMD에 의해 고안되었다. 이 아키텍처는 인텔 64라는 이름으로 인텔에 의해 복제되기도 했다. (옘힐, 클래카마스 기술, CT, IA-32e, EM64T 등으로",
|
|
||||||
"불렸음) 이로써 x86-64 또는 x64의 이름을 일상적으로 사용하기에 이르렀다.",
|
|
||||||
"",
|
|
||||||
"x86-64 (также AMD64/Intel64/EM64T) — 64-битное расширение, набор команд для архитектуры x86, разработанное",
|
|
||||||
"компанией AMD, позволяющее выполнять программы в 64-разрядном режиме. Это расширение архитектуры x86 с",
|
|
||||||
"почти полной обратной совместимостью.",
|
|
||||||
"",
|
|
||||||
"Επίσης η x86-64 έχει καταχωρητές γενικής χρήσης 64-bit και πολλές άλλες βελτιώσεις. Η αρχική προδιαγραφή",
|
|
||||||
"δημιουργήθηκε από την AMD και έχει υλοποιηθεί από την AMD, την Intel, τη VIA και άλλες εταιρείες. Διατηρεί πλήρη",
|
|
||||||
"συμβατότητα προς τα πίσω με κώδικα 32-bit.",
|
|
||||||
"",
|
|
||||||
"x86-64 (簡稱x64) 是64位版本的x86指令集,向后相容於16位及32位的x86架構。x64於1999年由AMD設計,AMD首次公開",
|
|
||||||
"64位元集以擴充給x86,稱為「AMD64」。其後也為英特爾所採用,現時英特爾稱之為「Intel 64」,在之前曾使用過「Clackamas",
|
|
||||||
"Technology」 (CT)、「IA-32e」及「EM64T」",
|
|
||||||
"",
|
|
||||||
"x86-64, ou x64, est une extension du jeu d'instructions x86 d'Intel, introduite par la société AMD avec la gamme",
|
|
||||||
"AMD64. Intel utilisera cette extension en l'appelant initialement EM64T renommé aujourd'hui en Intel 64.",
|
|
||||||
"",
|
|
||||||
"Amd64 (також x86-64/intel64/em64t/x64) — 64-бітова архітектура мікропроцесора і відповідний набір інструкцій,",
|
|
||||||
"розроблені компанією AMD. Це розширення архітектури x86 з повною зворотною сумісністю.",
|
|
||||||
"",
|
|
||||||
"x86-64 е наименованието на наборът от 64-битови разширения към x86 процесорната архитектура. Като синоним",
|
|
||||||
"на това наименование, се използват и съкращенията AMD64 (използвано от AMD), EM64T и IA-32e (използвани от",
|
|
||||||
"Intel) и x64 (използвано от Microsoft).",
|
|
||||||
"",
|
|
||||||
"เอกซ์86-64 (x86-64) เป็นชื่อของสถาปัตยกรรมคอมพิวเตอร์สำหรับไมโครโพรเซสเซอร์แบบ 64 บิต และชุดคำสั่งที่ใช้งานด้วยกัน x86-64",
|
|
||||||
"เป็นส่วนขยายของสถาปัตยกรรมแบบ x86 ออกแบบโดยบริษัท AMD และใช้ชื่อทางการค้าว่า AMD64 ในภายหลังบริษัทอินเทลได้นำสถาปัตยกร",
|
|
||||||
"รมนี้ไปใช้ใต้ชื่อการค้าว่า Intel 64 หรือ EM64T ซึ่งชื่อทั่วไปที่ใช้กันโดยไม่อิงกับชื่อการค้าคือ x86-64 หรือ x64"
|
|
||||||
)
|
|
||||||
|
|
||||||
override fun render() {
|
override fun render() {
|
||||||
|
val iterations = 16
|
||||||
|
val radius = 4f
|
||||||
|
|
||||||
|
|
||||||
Gdx.gl.glClearColor(.157f, .157f, .157f, 0f)
|
Gdx.gl.glClearColor(.157f, .157f, .157f, 0f)
|
||||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
|
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
|
||||||
|
|
||||||
Gdx.graphics.setTitle("$GAME_NAME — F: ${Gdx.graphics.framesPerSecond}")
|
|
||||||
|
|
||||||
(gameFont as GameFontBase).reload("bg")
|
blurFboA.inAction {
|
||||||
|
Gdx.gl.glClearColor(0f, 0f, 0f, 0f)
|
||||||
|
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
|
||||||
|
}
|
||||||
|
|
||||||
batch.inBatch {
|
blurFboB.inAction {
|
||||||
|
Gdx.gl.glClearColor(0f, 0f, 0f, 0f)
|
||||||
|
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
|
||||||
|
}
|
||||||
|
|
||||||
text.forEachIndexed { index, s ->
|
|
||||||
gameFont.color = Color(1f, 1f, 1f, 1f)
|
var writeBuffer = blurFboA
|
||||||
gameFont.draw(batch, s, 10f, 10 + (20 * text.size) - 20f * index)
|
var readBuffer = blurFboB
|
||||||
|
|
||||||
|
|
||||||
|
for (i in 0..iterations - 1) {
|
||||||
|
writeBuffer.inAction {
|
||||||
|
batch.inUse {
|
||||||
|
cam.setToOrtho(false, writeBuffer.width.toFloat(), writeBuffer.height.toFloat())
|
||||||
|
batch.projectionMatrix = cam.combined
|
||||||
|
|
||||||
|
|
||||||
|
val texture = if (i == 0)
|
||||||
|
img
|
||||||
|
else
|
||||||
|
readBuffer.colorBufferTexture
|
||||||
|
|
||||||
|
texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear)
|
||||||
|
|
||||||
|
batch.shader = blurShader
|
||||||
|
batch.shader.setUniformf("flip", 1f)
|
||||||
|
if (i % 2 == 0)
|
||||||
|
batch.shader.setUniformf("direction", radius, 0f)
|
||||||
|
else
|
||||||
|
batch.shader.setUniformf("direction", 0f, radius)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
batch.draw(texture, 0f, 0f)
|
||||||
|
|
||||||
|
|
||||||
|
// swap
|
||||||
|
val t = writeBuffer
|
||||||
|
writeBuffer = readBuffer
|
||||||
|
readBuffer = t
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw last FBO to screen
|
||||||
|
batch.inUse {
|
||||||
|
cam.setToOrtho(false, Gdx.graphics.width.toFloat(), Gdx.graphics.height.toFloat())
|
||||||
|
batch.projectionMatrix = cam.combined
|
||||||
|
|
||||||
|
|
||||||
|
batch.shader.setUniformf("direction", 0f, 0f)
|
||||||
|
batch.shader.setUniformf("flip", if (iterations % 2 != 0) 1f else 0f)
|
||||||
|
batch.draw(writeBuffer.colorBufferTexture, 0f, 0f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,11 +133,18 @@ class TestTestTest : ApplicationAdapter() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private inline fun SpriteBatch.inBatch(action: () -> Unit) {
|
private inline fun SpriteBatch.inUse(action: () -> Unit) {
|
||||||
this.begin()
|
this.begin()
|
||||||
action()
|
action()
|
||||||
this.end()
|
this.end()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline fun FrameBuffer.inAction(action: (FrameBuffer) -> Unit) {
|
||||||
|
this.begin()
|
||||||
|
action(this)
|
||||||
|
this.end()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun main(args: Array<String>) { // LWJGL 3 won't work? java.lang.VerifyError
|
fun main(args: Array<String>) { // LWJGL 3 won't work? java.lang.VerifyError
|
||||||
|
|||||||
Reference in New Issue
Block a user