| @@ -74,3 +74,71 @@ void main(void) | |||||
| gl_FragColor = vec4(mix(p.x, 1.0, lum), lum, lum, 1.0); | gl_FragColor = vec4(mix(p.x, 1.0, lum), lum, lum, 1.0); | ||||
| } | } | ||||
| [vert.hlsl] | |||||
| void main(float2 in_Position : POSITION, | |||||
| out float4 out_Position : POSITION, | |||||
| out float4 pass_Position : TEXCOORD0) | |||||
| { | |||||
| pass_Position = float4(0.5 * in_Position + 0.5, 0.0, 1.0); | |||||
| out_Position = float4(in_Position, 0.5, 1.0); | |||||
| } | |||||
| [frag.hlsl] | |||||
| float segdist(float2 p1, float2 p2, float2 a) | |||||
| { | |||||
| float d = max(1e-10, dot(p2 - p1, p2 - p1)); | |||||
| float t = clamp(dot(a - p1, p2 - p1) / d, 0.0, 1.0); | |||||
| return distance(a, lerp(p1, p2, t)); | |||||
| } | |||||
| void main(in float4 pass_Position : TEXCOORD0, | |||||
| uniform sampler2D u_Texture, | |||||
| out float4 out_FragColor : COLOR) | |||||
| { | |||||
| float width = 800.0; | |||||
| float height = 600.0; | |||||
| float texture_width = 256.0; | |||||
| float line_width = 1.2; | |||||
| float dot_size = 1.0; | |||||
| float4 delta = float4(1.0 / texture_width, 0.0, | |||||
| 2.0 / texture_width, 0.0); | |||||
| float2 p = pass_Position.xy; | |||||
| float2 tc = float2(floor(p.x * texture_width) / texture_width, p.y); | |||||
| float t = p.x * texture_width - floor(p.x * texture_width); | |||||
| float4 c; | |||||
| c[0] = tex2D(u_Texture, tc - delta.xy).x; | |||||
| c[1] = tex2D(u_Texture, tc).x; | |||||
| c[2] = tex2D(u_Texture, tc + delta.xy).x; | |||||
| c[3] = tex2D(u_Texture, tc + delta.zw).x; | |||||
| /* Find the 4 closest points in screen space */ | |||||
| float2 p0 = float2((tc.x - delta.x) * width, c[0] * height); | |||||
| float2 p1 = float2((tc.x ) * width, c[1] * height); | |||||
| float2 p2 = float2((tc.x + delta.x) * width, c[2] * height); | |||||
| float2 p3 = float2((tc.x + delta.z) * width, c[3] * height); | |||||
| float2 a = float2(p.x * width, p.y * height); | |||||
| /* Compute distance to segments */ | |||||
| float d = segdist(p0, p1, a); | |||||
| d = min(d, segdist(p1, p2, a)); | |||||
| d = min(d, segdist(p2, p3, a)); | |||||
| /* Compute distance to dots */ | |||||
| d = min(d, length(a - p0) - dot_size); | |||||
| d = min(d, length(a - p1) - dot_size); | |||||
| d = min(d, length(a - p2) - dot_size); | |||||
| d = min(d, length(a - p3) - dot_size); | |||||
| /* Add line width */ | |||||
| float lum = clamp(line_width - d, 0.0, 1.0); | |||||
| /* Compensate for sRGB */ | |||||
| lum = pow(1.0 - lum, 1.0 / 2.4); | |||||
| /* Choose some funny colours */ | |||||
| out_FragColor = float4(lerp(p.x, 1.0, lum), lum, lum, 1.0); | |||||
| } | |||||