0025214: HLR fails to project edges
[occt.git] / src / Shaders / RaytraceRender.fs
CommitLineData
fc73a202 1out vec4 OutColor;
2
3a9b5dc8 3// Seed for random number generator (generated on CPU).
189f85a3 4uniform int uFrameRndSeed;
5
3a9b5dc8 6//! Enables/disables using of single RNG seed for 16x16 image
7//! blocks. Increases performance up to 4x, but the noise has
8//! become structured. Can be used fo final rendering.
9uniform int uBlockedRngEnabled;
189f85a3 10
3a9b5dc8 11#ifndef ADAPTIVE_SAMPLING
12 //! Weight of current frame related to accumulated samples.
13 uniform float uSampleWeight;
189f85a3 14
3a9b5dc8 15 //! Input accumulated image.
16 uniform sampler2D uAccumTexture;
17#endif
8c820969 18
3a9b5dc8 19//! Maximum radiance that can be added to the pixel. Decreases noise
20//! level, but introduces some bias.
21#define MAX_RADIANCE vec3 (25.f)
8c820969 22
fc73a202 23// =======================================================================
24// function : main
25// purpose :
26// =======================================================================
27void main (void)
28{
3a9b5dc8 29 SeedRand (uFrameRndSeed, uWinSizeX, uBlockedRngEnabled == 0 ? 1 : 16);
30
189f85a3 31#ifndef PATH_TRACING
3a9b5dc8 32
fc73a202 33 SRay aRay = GenerateRay (vPixel);
3a9b5dc8 34
189f85a3 35#else
189f85a3 36
3a9b5dc8 37 ivec2 aFragCoord = ivec2 (gl_FragCoord.xy);
189f85a3 38
3a9b5dc8 39#ifdef ADAPTIVE_SAMPLING
189f85a3 40
3a9b5dc8 41 ivec2 aTileXY = imageLoad (uOffsetImage, ivec2 (aFragCoord.x / BLOCK_SIZE,
42 aFragCoord.y / BLOCK_SIZE)).xy;
189f85a3 43
3a9b5dc8 44 ivec2 aRealBlockSize = ivec2 (min (uWinSizeX - aTileXY.x, BLOCK_SIZE),
45 min (uWinSizeY - aTileXY.y, BLOCK_SIZE));
46
47 aFragCoord.x = aTileXY.x + (aFragCoord.x % aRealBlockSize.x);
48 aFragCoord.y = aTileXY.y + (aFragCoord.y % aRealBlockSize.y);
49
50#endif // ADAPTIVE_SAMPLING
51
52 vec2 aPnt = vec2 (aFragCoord.x + RandFloat(),
53 aFragCoord.y + RandFloat());
54
55 SRay aRay = GenerateRay (aPnt / vec2 (uWinSizeX, uWinSizeY));
56
57#endif // PATH_TRACING
58
59 vec3 aInvDirect = InverseDirection (aRay.Direct);
fc73a202 60
189f85a3 61#ifdef PATH_TRACING
3a9b5dc8 62
189f85a3 63 vec4 aColor = PathTrace (aRay, aInvDirect);
64
3a9b5dc8 65 if (any (isnan (aColor.rgb)))
189f85a3 66 {
8c820969 67 aColor.rgb = ZERO;
189f85a3 68 }
69
8c820969 70 aColor.rgb = min (aColor.rgb, MAX_RADIANCE);
189f85a3 71
3a9b5dc8 72#ifdef ADAPTIVE_SAMPLING
73
74 // accumulate RGB color and depth
75 imageAtomicAdd (uRenderImage, ivec2 (3 * aFragCoord.x + 0,
76 2 * aFragCoord.y + 0), aColor.r);
77 imageAtomicAdd (uRenderImage, ivec2 (3 * aFragCoord.x + 1,
78 2 * aFragCoord.y + 0), aColor.g);
79 imageAtomicAdd (uRenderImage, ivec2 (3 * aFragCoord.x + 1,
80 2 * aFragCoord.y + 1), aColor.b);
81 imageAtomicAdd (uRenderImage, ivec2 (3 * aFragCoord.x + 2,
82 2 * aFragCoord.y + 1), aColor.w);
83
84 // accumulate number of samples
85 float aNbSamples = imageAtomicAdd (uRenderImage, ivec2 (3 * aFragCoord.x + 0,
86 2 * aFragCoord.y + 1), 1.0);
87
88 if (int (aNbSamples) % 2 == 0) // accumulate luminance for even samples only
89 {
90 imageAtomicAdd (uRenderImage, ivec2 (3 * aFragCoord.x + 2,
91 2 * aFragCoord.y + 0), dot (LUMA, aColor.rgb));
92 }
93
94 discard; // fragment should not be written to frame buffer
95
96#else
97
8c820969 98 OutColor = mix (texture2D (uAccumTexture, vPixel), aColor, uSampleWeight);
3a9b5dc8 99
100#endif // ADAPTIVE_SAMPLING
101
189f85a3 102#else
3a9b5dc8 103
fc73a202 104 OutColor = clamp (Radiance (aRay, aInvDirect), 0.f, 1.f);
3a9b5dc8 105
106#endif // PATH_TRACING
fc73a202 107}