Skip to content

Commit 46a00f1

Browse files
authored
Merge pull request #180 from Hyllian/master
Port of crt-nobody
2 parents 0c3d862 + 58d6555 commit 46a00f1

File tree

2 files changed

+226
-0
lines changed

2 files changed

+226
-0
lines changed

crt/crt-nobody.glslp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
shaders = 1
2+
3+
shader0 = shaders/crt-nobody.glsl
4+
filter_linear0 = false

crt/shaders/crt-nobody.glsl

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
#version 120
2+
3+
/*
4+
Hyllian's crt-nobody Shader
5+
6+
Copyright (C) 2011-2022 Hyllian - [email protected]
7+
8+
Permission is hereby granted, free of charge, to any person obtaining a copy
9+
of this software and associated documentation files (the "Software"), to deal
10+
in the Software without restriction, including without limitation the rights
11+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
copies of the Software, and to permit persons to whom the Software is
13+
furnished to do so, subject to the following conditions:
14+
15+
The above copyright notice and this permission notice shall be included in
16+
all copies or substantial portions of the Software.
17+
18+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
THE SOFTWARE.
25+
*/
26+
27+
#pragma parameter VSCANLINES "Vertical Scanlines" 0.0 0.0 1.0 1.0
28+
#pragma parameter SCAN_SIZE "Scanlines Size" 0.86 0.0 2.0 0.01
29+
#pragma parameter COLOR_BOOST "Color Boost" 1.25 1.0 2.0 0.05
30+
#pragma parameter InputGamma "INPUT GAMMA" 2.4 0.0 4.0 0.1
31+
#pragma parameter OutputGamma "OUTPUT GAMMA" 2.2 0.0 3.0 0.1
32+
33+
#define PIX_SIZE 1.11
34+
35+
#define saturate(c) clamp(c, 0.0, 1.0)
36+
#define lerp(a,b,c) mix(a,b,c)
37+
#define mul(a,b) (b*a)
38+
#define fmod(c,d) mod(c,d)
39+
#define frac(c) fract(c)
40+
#define tex2D(c,d) COMPAT_TEXTURE(c,d)
41+
#define float2 vec2
42+
#define float3 vec3
43+
#define float4 vec4
44+
#define int2 ivec2
45+
#define int3 ivec3
46+
#define int4 ivec4
47+
#define bool2 bvec2
48+
#define bool3 bvec3
49+
#define bool4 bvec4
50+
#define float2x2 mat2x2
51+
#define float3x3 mat3x3
52+
#define float4x4 mat4x4
53+
54+
#if defined(VERTEX)
55+
56+
#if __VERSION__ >= 130
57+
#define COMPAT_VARYING out
58+
#define COMPAT_ATTRIBUTE in
59+
#define COMPAT_TEXTURE texture
60+
#else
61+
#define COMPAT_VARYING varying
62+
#define COMPAT_ATTRIBUTE attribute
63+
#define COMPAT_TEXTURE texture2D
64+
#endif
65+
66+
#ifdef GL_ES
67+
#define COMPAT_PRECISION mediump
68+
#else
69+
#define COMPAT_PRECISION
70+
#endif
71+
72+
COMPAT_ATTRIBUTE vec4 VertexCoord;
73+
COMPAT_ATTRIBUTE vec4 COLOR;
74+
COMPAT_ATTRIBUTE vec4 TexCoord;
75+
COMPAT_VARYING vec4 COL0;
76+
COMPAT_VARYING vec4 TEX0;
77+
COMPAT_VARYING vec4 t1;
78+
COMPAT_VARYING float pix_sizex;
79+
COMPAT_VARYING float scan_sizey;
80+
81+
uniform mat4 MVPMatrix;
82+
uniform COMPAT_PRECISION int FrameDirection;
83+
uniform COMPAT_PRECISION int FrameCount;
84+
uniform COMPAT_PRECISION vec2 OutputSize;
85+
uniform COMPAT_PRECISION vec2 TextureSize;
86+
uniform COMPAT_PRECISION vec2 InputSize;
87+
88+
#define vTexCoord TEX0.xy
89+
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
90+
#define outsize vec4(OutputSize, 1.0 / OutputSize)
91+
92+
#ifdef PARAMETER_UNIFORM
93+
uniform COMPAT_PRECISION float VSCANLINES;
94+
uniform COMPAT_PRECISION float SCAN_SIZE;
95+
uniform COMPAT_PRECISION float COLOR_BOOST;
96+
uniform COMPAT_PRECISION float InputGamma;
97+
uniform COMPAT_PRECISION float OutputGamma;
98+
#else
99+
#define VSCANLINES 0.0
100+
#define SCAN_SIZE 0.86
101+
#define COLOR_BOOST 1.25
102+
#define InputGamma 2.4
103+
#define OutputGamma 2.2
104+
#endif
105+
106+
void main()
107+
{
108+
gl_Position = MVPMatrix * VertexCoord;
109+
COL0 = COLOR;
110+
TEX0.xy = TexCoord.xy * 1.0001;
111+
112+
pix_sizex = mix(PIX_SIZE, SCAN_SIZE, VSCANLINES);
113+
scan_sizey = mix(SCAN_SIZE, PIX_SIZE, VSCANLINES);
114+
115+
float2 ps = float2(SourceSize.z, SourceSize.w);
116+
float dx = ps.x;
117+
float dy = ps.y;
118+
119+
t1.xy = float2( dx, 0.); // F
120+
t1.zw = float2( 0., dy); // H
121+
}
122+
123+
#elif defined(FRAGMENT)
124+
125+
#if __VERSION__ >= 130
126+
#define COMPAT_VARYING in
127+
#define COMPAT_TEXTURE texture
128+
out vec4 FragColor;
129+
#else
130+
#define COMPAT_VARYING varying
131+
#define FragColor gl_FragColor
132+
#define COMPAT_TEXTURE texture2D
133+
#endif
134+
135+
#ifdef GL_ES
136+
#ifdef GL_FRAGMENT_PRECISION_HIGH
137+
precision highp float;
138+
#else
139+
precision mediump float;
140+
#endif
141+
#define COMPAT_PRECISION mediump
142+
#else
143+
#define COMPAT_PRECISION
144+
#endif
145+
146+
uniform COMPAT_PRECISION int FrameDirection;
147+
uniform COMPAT_PRECISION int FrameCount;
148+
uniform COMPAT_PRECISION vec2 OutputSize;
149+
uniform COMPAT_PRECISION vec2 TextureSize;
150+
uniform COMPAT_PRECISION vec2 InputSize;
151+
uniform sampler2D Texture;
152+
COMPAT_VARYING vec4 TEX0;
153+
COMPAT_VARYING vec4 t1;
154+
COMPAT_VARYING float pix_sizex;
155+
COMPAT_VARYING float scan_sizey;
156+
157+
158+
#ifdef PARAMETER_UNIFORM
159+
uniform COMPAT_PRECISION float VSCANLINES;
160+
uniform COMPAT_PRECISION float SCAN_SIZE;
161+
uniform COMPAT_PRECISION float COLOR_BOOST;
162+
uniform COMPAT_PRECISION float InputGamma;
163+
uniform COMPAT_PRECISION float OutputGamma;
164+
#else
165+
#define VSCANLINES 0.0
166+
#define SCAN_SIZE 0.86
167+
#define COLOR_BOOST 1.25
168+
#define InputGamma 2.4
169+
#define OutputGamma 2.2
170+
#endif
171+
172+
// compatibility #defines
173+
#define Source Texture
174+
#define vTexCoord TEX0.xy
175+
176+
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
177+
#define outsize vec4(OutputSize, 1.0 / OutputSize)
178+
179+
#define decal Source
180+
181+
#define GAMMA_IN(color) pow(color, float3(InputGamma, InputGamma, InputGamma))
182+
#define GAMMA_OUT(color) pow(color, float3(1.0 / OutputGamma, 1.0 / OutputGamma, 1.0 / OutputGamma))
183+
184+
float wgt(float size)
185+
{
186+
size = clamp(size, -1.0, 1.0);
187+
188+
size = 1.0 - size * size;
189+
190+
return size * size * size;
191+
}
192+
193+
194+
void main()
195+
{
196+
float2 pos = frac(vTexCoord*SourceSize.xy)-float2(0.5, 0.5); // pos = pixel position
197+
float2 dir = sign(pos); // dir = pixel direction
198+
pos = abs(pos);
199+
200+
float2 g1 = dir*t1.xy;
201+
float2 g2 = dir*t1.zw;
202+
203+
float3 A = GAMMA_IN(tex2D(decal, vTexCoord ).xyz);
204+
float3 B = GAMMA_IN(tex2D(decal, vTexCoord +g1 ).xyz);
205+
float3 C = GAMMA_IN(tex2D(decal, vTexCoord +g2).xyz);
206+
float3 D = GAMMA_IN(tex2D(decal, vTexCoord +g1+g2).xyz);
207+
208+
float2 dx = float2(pos.x, 1.0-pos.x) / pix_sizex;
209+
float2 dy = float2(pos.y, 1.0-pos.y) / scan_sizey;
210+
211+
float2 wx = float2(wgt(dx.x), wgt(dx.y));
212+
float2 wy = float2(wgt(dy.x), wgt(dy.y));
213+
214+
float3 color = (A*wx.x + B*wx.y)*wy.x + (C*wx.x + D*wx.y)*wy.y;
215+
216+
color *= COLOR_BOOST;
217+
218+
color = GAMMA_OUT(color);
219+
220+
FragColor = vec4(color, 1.0);
221+
}
222+
#endif

0 commit comments

Comments
 (0)