fc73a202 |
1 | //! Input ray-traced image. |
2 | uniform sampler2D uFSAAInputTexture; |
3 | |
4 | //! Number of accumulated FSAA samples. |
5 | uniform int uSamples; |
6 | |
fc73a202 |
7 | //! Output pixel color. |
8 | out vec4 OutColor; |
9 | |
10 | #define LUM_DIFFERENCE 0.085f |
11 | |
fc73a202 |
12 | // ======================================================================= |
13 | // function : main |
14 | // purpose : |
15 | // ======================================================================= |
16 | void main (void) |
17 | { |
189f85a3 |
18 | #ifndef PATH_TRACING |
19 | |
fc73a202 |
20 | int aPixelX = int (gl_FragCoord.x); |
21 | int aPixelY = int (gl_FragCoord.y); |
22 | |
50d0e1ce |
23 | // Adjust FLIPTRI pattern used for adaptive FSAA |
24 | float anOffsetX = mix (uOffsetX, -uOffsetX, float (aPixelX % 2)); |
25 | float anOffsetY = mix (uOffsetY, -uOffsetY, float (aPixelY % 2)); |
26 | |
fc73a202 |
27 | vec4 aClr0 = texelFetch (uFSAAInputTexture, ivec2 (aPixelX + 0, aPixelY + 0), 0); |
28 | vec4 aClr1 = texelFetch (uFSAAInputTexture, ivec2 (aPixelX + 0, aPixelY - 1), 0); |
29 | vec4 aClr2 = texelFetch (uFSAAInputTexture, ivec2 (aPixelX + 0, aPixelY + 1), 0); |
30 | |
31 | vec4 aClr3 = texelFetch (uFSAAInputTexture, ivec2 (aPixelX + 1, aPixelY + 0), 0); |
32 | vec4 aClr4 = texelFetch (uFSAAInputTexture, ivec2 (aPixelX + 1, aPixelY - 1), 0); |
33 | vec4 aClr5 = texelFetch (uFSAAInputTexture, ivec2 (aPixelX + 1, aPixelY + 1), 0); |
34 | |
35 | vec4 aClr6 = texelFetch (uFSAAInputTexture, ivec2 (aPixelX - 1, aPixelY + 0), 0); |
36 | vec4 aClr7 = texelFetch (uFSAAInputTexture, ivec2 (aPixelX - 1, aPixelY - 1), 0); |
37 | vec4 aClr8 = texelFetch (uFSAAInputTexture, ivec2 (aPixelX - 1, aPixelY + 1), 0); |
38 | |
39 | float aLum = dot (LUMA, aClr0.xyz); |
40 | |
41 | bool aRender = abs (aClr1.w - aClr0.w) > LUM_DIFFERENCE || |
42 | abs (aClr2.w - aClr0.w) > LUM_DIFFERENCE || |
43 | abs (aClr3.w - aClr0.w) > LUM_DIFFERENCE || |
44 | abs (aClr4.w - aClr0.w) > LUM_DIFFERENCE || |
45 | abs (aClr5.w - aClr0.w) > LUM_DIFFERENCE || |
46 | abs (aClr6.w - aClr0.w) > LUM_DIFFERENCE || |
47 | abs (aClr7.w - aClr0.w) > LUM_DIFFERENCE || |
48 | abs (aClr8.w - aClr0.w) > LUM_DIFFERENCE; |
50d0e1ce |
49 | |
fc73a202 |
50 | if (!aRender) |
51 | { |
52 | aRender = abs (dot (LUMA, aClr1.xyz) - aLum) > LUM_DIFFERENCE || |
53 | abs (dot (LUMA, aClr2.xyz) - aLum) > LUM_DIFFERENCE || |
54 | abs (dot (LUMA, aClr3.xyz) - aLum) > LUM_DIFFERENCE || |
55 | abs (dot (LUMA, aClr4.xyz) - aLum) > LUM_DIFFERENCE || |
56 | abs (dot (LUMA, aClr5.xyz) - aLum) > LUM_DIFFERENCE || |
57 | abs (dot (LUMA, aClr6.xyz) - aLum) > LUM_DIFFERENCE || |
58 | abs (dot (LUMA, aClr7.xyz) - aLum) > LUM_DIFFERENCE || |
59 | abs (dot (LUMA, aClr8.xyz) - aLum) > LUM_DIFFERENCE; |
60 | } |
61 | |
62 | vec4 aColor = aClr0; |
50d0e1ce |
63 | |
fc73a202 |
64 | if (aRender) |
65 | { |
50d0e1ce |
66 | SRay aRay = GenerateRay (vPixel + vec2 (anOffsetX, anOffsetY)); |
67 | |
fc73a202 |
68 | vec3 aInvDirect = 1.f / max (abs (aRay.Direct), SMALL); |
50d0e1ce |
69 | |
fc73a202 |
70 | aInvDirect = vec3 (aRay.Direct.x < 0.f ? -aInvDirect.x : aInvDirect.x, |
71 | aRay.Direct.y < 0.f ? -aInvDirect.y : aInvDirect.y, |
72 | aRay.Direct.z < 0.f ? -aInvDirect.z : aInvDirect.z); |
50d0e1ce |
73 | |
fc73a202 |
74 | aColor = mix (aClr0, clamp (Radiance (aRay, aInvDirect), 0.f, 1.f), 1.f / uSamples); |
75 | } |
50d0e1ce |
76 | |
fc73a202 |
77 | OutColor = aColor; |
189f85a3 |
78 | |
79 | #endif |
ee5befae |
80 | } |