[retro-gtk] glsl-filters: Re-add bicubic and sharp filters
- From: Adrien Plazas <aplazas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [retro-gtk] glsl-filters: Re-add bicubic and sharp filters
- Date: Tue, 4 Feb 2020 20:52:36 +0000 (UTC)
commit b1c3c3ec889160a4a74990ce11b5047868bf114c
Author: Alexander Mikhaylenko <alexm gnome org>
Date: Fri Jan 31 22:53:03 2020 +0500
glsl-filters: Re-add bicubic and sharp filters
Revert commit fd78cbae0f9f8c49c8dceb2437cdae237bfc7e96.
Also use unix newlines in bicubic.fs and explicitly specify all properties
in bicubic.filter to avoid warnings.
retro-gtk/glsl-filters/bicubic.filter | 8 ++++
retro-gtk/glsl-filters/bicubic.fs | 90 +++++++++++++++++++++++++++++++++++
retro-gtk/glsl-filters/sharp.filter | 7 +++
retro-gtk/glsl-filters/sharp.fs | 13 +++++
retro-gtk/glsl-filters/sharp.vs | 20 ++++++++
retro-gtk/retro-gtk.gresource.xml | 5 ++
6 files changed, 143 insertions(+)
---
diff --git a/retro-gtk/glsl-filters/bicubic.filter b/retro-gtk/glsl-filters/bicubic.filter
new file mode 100644
index 0000000..6f4c971
--- /dev/null
+++ b/retro-gtk/glsl-filters/bicubic.filter
@@ -0,0 +1,8 @@
+[GLSL Filter]
+Filter=Linear
+Wrap=Border
+Vertex=sharp.vs
+Fragment=bicubic.fs
+Authors=hunterk;
+License=GPL-2.0+;
+URL=https://github.com/hizzlekizzle/quark-shaders/tree/master/Bicubic.shader
diff --git a/retro-gtk/glsl-filters/bicubic.fs b/retro-gtk/glsl-filters/bicubic.fs
new file mode 100644
index 0000000..1c7c689
--- /dev/null
+++ b/retro-gtk/glsl-filters/bicubic.fs
@@ -0,0 +1,90 @@
+#version 150
+
+uniform sampler2D source[];
+uniform vec4 sourceSize[];
+
+in Vertex {
+ vec2 texCoord;
+};
+
+ out vec4 fragColor;
+
+ float weight(float x)
+ {
+ float ax = abs(x);
+ // Mitchel-Netravali coefficients.
+ // Best psychovisual result.
+ const float B = 1.0 / 3.0;
+ const float C = 1.0 / 3.0;
+
+ if (ax < 1.0) {
+ return (
+ pow(x, 2.0) * (
+ (12.0 - 9.0 * B - 6.0 * C) * ax +
+ (-18.0 + 12.0 * B + 6.0 * C)
+ ) +
+ (6.0 - 2.0 * B)
+ ) / 6.0;
+
+ } else if ((ax >= 1.0) && (ax < 2.0)) {
+ return (
+ pow(x, 2.0) * (
+ (-B - 6.0 * C) * ax +
+ (6.0 * B + 30.0 * C)
+ ) +
+ (-12.0 * B - 48.0 * C) * ax +
+ (8.0 * B + 24.0 * C)
+ ) / 6.0;
+
+ } else {
+ return 0.0;
+ }
+ }
+
+ vec4 weight4(float x)
+ {
+ return vec4(
+ weight(x + 1.0),
+ weight(x),
+ weight(1.0 - x),
+ weight(2.0 - x));
+ }
+
+ vec3 pixel(float xpos, float ypos)
+ {
+ return texture2D(source[0], vec2(xpos, ypos)).rgb;
+ }
+
+ vec3 line(float ypos, vec4 xpos, vec4 linetaps)
+ {
+ return
+ pixel(xpos.r, ypos) * linetaps.r +
+ pixel(xpos.g, ypos) * linetaps.g +
+ pixel(xpos.b, ypos) * linetaps.b +
+ pixel(xpos.a, ypos) * linetaps.a;
+ }
+
+ void main()
+ {
+ vec2 stepxy = 1.0 / sourceSize[0].xy;
+ vec2 pos = texCoord.xy + stepxy * 0.5;
+ vec2 f = fract(pos / stepxy);
+
+ vec4 linetaps = weight4(f.x);
+ vec4 columntaps = weight4(f.y);
+
+ // make sure all taps added together is exactly 1.0, otherwise some
+ // (very small) distortion can occur
+ linetaps /= linetaps.r + linetaps.g + linetaps.b + linetaps.a;
+ columntaps /= columntaps.r + columntaps.g + columntaps.b + columntaps.a;
+
+ vec2 xystart = (-1.5 - f) * stepxy + pos;
+ vec4 xpos = vec4(
+ xystart.x,
+ xystart.x + stepxy.x,
+ xystart.x + stepxy.x * 2.0,
+ xystart.x + stepxy.x * 3.0);
+
+ fragColor.a = 1.0;
+ fragColor.rgb = line(xystart.y, xpos, linetaps) * columntaps.r + line(xystart.y + stepxy.y, xpos,
linetaps) * columntaps.g + line(xystart.y + stepxy.y * 2.0, xpos, linetaps) * columntaps.b + line(xystart.y +
stepxy.y * 3.0, xpos, linetaps) * columntaps.a;
+ }
diff --git a/retro-gtk/glsl-filters/sharp.filter b/retro-gtk/glsl-filters/sharp.filter
new file mode 100644
index 0000000..cb22335
--- /dev/null
+++ b/retro-gtk/glsl-filters/sharp.filter
@@ -0,0 +1,7 @@
+[GLSL Filter]
+Filter=Nearest
+Wrap=Border
+Vertex=sharp.vs
+Fragment=sharp.fs
+Authors=Adrien Plazas;
+License=GPL-3.0+;
diff --git a/retro-gtk/glsl-filters/sharp.fs b/retro-gtk/glsl-filters/sharp.fs
new file mode 100644
index 0000000..93f7013
--- /dev/null
+++ b/retro-gtk/glsl-filters/sharp.fs
@@ -0,0 +1,13 @@
+#version 150
+
+uniform sampler2D source[];
+
+in Vertex {
+ vec2 texCoord;
+};
+
+out vec4 fragColor;
+
+void main() {
+ fragColor = texture(source[0], texCoord);
+}
diff --git a/retro-gtk/glsl-filters/sharp.vs b/retro-gtk/glsl-filters/sharp.vs
new file mode 100644
index 0000000..cfe4a83
--- /dev/null
+++ b/retro-gtk/glsl-filters/sharp.vs
@@ -0,0 +1,20 @@
+#version 150 core
+
+in vec2 position;
+in vec2 texCoord;
+
+out Vertex {
+ vec2 texCoord;
+} vertexOut;
+
+uniform float relative_aspect_ratio;
+
+void main ()
+{
+ vec2 aspect_ratio = (relative_aspect_ratio > 1.0f) ?
+ vec2 (1.0 / relative_aspect_ratio, 1.0) :
+ vec2 (1.0, relative_aspect_ratio);
+
+ vertexOut.texCoord = texCoord;
+ gl_Position = vec4 (position.xy * aspect_ratio, 0.0, 1.0);
+}
diff --git a/retro-gtk/retro-gtk.gresource.xml b/retro-gtk/retro-gtk.gresource.xml
index f88aa9a..3ca75a1 100644
--- a/retro-gtk/retro-gtk.gresource.xml
+++ b/retro-gtk/retro-gtk.gresource.xml
@@ -1,8 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/org/gnome/Retro">
+ <file>glsl-filters/bicubic.filter</file>
+ <file>glsl-filters/bicubic.fs</file>
<file>glsl-filters/crt-simple.filter</file>
<file>glsl-filters/crt-simple.fs</file>
<file>glsl-filters/crt-simple.vs</file>
+ <file>glsl-filters/sharp.filter</file>
+ <file>glsl-filters/sharp.fs</file>
+ <file>glsl-filters/sharp.vs</file>
</gresource>
</gresources>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]