ProjectArcade
43 строки · 1.2 Кб
1// Simple Bloom shader; created to use in PPSSPP.
2// Without excessive samples and complex nested loops
3// (to make it compatible with low-end GPUs and to ensure ps_2_0 compatibility).
4
5#ifdef GL_ES
6precision mediump float;
7precision mediump int;
8#endif
9
10uniform sampler2D sampler0;
11varying vec2 v_texcoord0;
12
13uniform vec4 u_setting;
14
15void main()
16{
17//get the pixel color
18vec3 color = texture2D(sampler0, v_texcoord0.xy).xyz;
19gl_FragColor.rgb = color;
20float gray = (color.r + color.g + color.b) / 3.0;
21float saturation = (abs(color.r - gray) + abs(color.g - gray) + abs(color.b - gray)) / 3.0;
22
23//show the effect mainly on bright parts of the screen
24float step = 0.001 * gray / max(saturation, 0.25) * u_setting.x;
25
26//sum the neightbor pixels
27vec3 sum = vec3(0);
28for (int x = -3; x <= 3; x += 2)
29{
30for (int y = -3; y <= 3; y += 2)
31{
32color = texture2D(sampler0, v_texcoord0 + vec2(x, y)*step).xyz;
33gray = (color.r + color.g + color.b) / 3.0;
34saturation = (abs(color.r - gray) + abs(color.g - gray) + abs(color.b - gray)) / 3.0;
35sum += color * gray * gray / max(saturation, 0.25);
36}
37}
38sum /= 16.0;
39
40//mix the color
41gl_FragColor.rgb += sum * u_setting.y;
42gl_FragColor.a = 1.0;
43}
44