0030476: Visualization, Path Tracing - Adaptive Screen Sampling leads to unstable...
[occt.git] / src / Shaders / Shaders_RaytraceRender_fs.pxx
index 1fe09ac..1d2f6db 100644 (file)
@@ -23,6 +23,26 @@ static const char Shaders_RaytraceRender_fs[] =
   "//! Decreases noise level, but introduces some bias.\n"
   "uniform float uMaxRadiance = 50.f;\n"
   "\n"
+  "#ifdef ADAPTIVE_SAMPLING\n"
+  "//! Wrapper over imageLoad()+imageStore() having similar syntax as imageAtomicAdd().\n"
+  "//! Modifies one component of 3Wx2H uRenderImage:\n"
+  "//! |RGL| Red, Green, Luminance\n"
+  "//! |SBH| Samples, Blue, Hit time transformed into OpenGL NDC space\n"
+  "//! Returns previous value of the component.\n"
+  "float addRenderImageComp (in ivec2 theFrag, in ivec2 theComp, in float theVal)\n"
+  "{\n"
+  "  ivec2 aCoord = ivec2 (3 * theFrag.x + theComp.x,\n"
+  "                        2 * theFrag.y + theComp.y);\n"
+  "#ifdef ADAPTIVE_SAMPLING_ATOMIC\n"
+  "  return imageAtomicAdd (uRenderImage, aCoord, theVal);\n"
+  "#else\n"
+  "  float aVal = imageLoad (uRenderImage, aCoord).x;\n"
+  "  imageStore (uRenderImage, aCoord, vec4 (aVal + theVal));\n"
+  "  return aVal;\n"
+  "#endif\n"
+  "}\n"
+  "#endif\n"
+  "\n"
   "// =======================================================================\n"
   "// function : main\n"
   "// purpose  :\n"
@@ -41,6 +61,7 @@ static const char Shaders_RaytraceRender_fs[] =
   "\n"
   "#ifdef ADAPTIVE_SAMPLING\n"
   "\n"
+  "#ifdef ADAPTIVE_SAMPLING_ATOMIC\n"
   "  ivec2 aTileXY = imageLoad (uOffsetImage, aFragCoord / uTileSize).xy * uTileSize;\n"
   "  if (aTileXY.x < 0) { discard; }\n"
   "\n"
@@ -49,6 +70,13 @@ static const char Shaders_RaytraceRender_fs[] =
   "\n"
   "  aFragCoord.x = aTileXY.x + (aFragCoord.x % aRealBlockSize.x);\n"
   "  aFragCoord.y = aTileXY.y + (aFragCoord.y % aRealBlockSize.y);\n"
+  "#else\n"
+  "  int aNbTileSamples = imageAtomicAdd (uTilesImage, aFragCoord / uTileSize, int(-1));\n"
+  "  if (aNbTileSamples <= 0)\n"
+  "  {\n"
+  "    discard;\n"
+  "  }\n"
+  "#endif\n"
   "\n"
   "#endif // ADAPTIVE_SAMPLING\n"
   "\n"
@@ -69,9 +97,7 @@ static const char Shaders_RaytraceRender_fs[] =
   "\n"
   "#else\n"
   "\n"
-  "  float aNbSamples = imageAtomicAdd (uRenderImage, ivec2 (3 * aFragCoord.x + 0,\n"
-  "                                                          2 * aFragCoord.y + 1), 1.0);\n"
-  "\n"
+  "  float aNbSamples = addRenderImageComp (aFragCoord, ivec2 (0, 1), 1.0);\n"
   "  vec4 aColor = PathTrace (aRay, aInvDirect, int (aNbSamples));\n"
   "\n"
   "#endif\n"
@@ -86,19 +112,14 @@ static const char Shaders_RaytraceRender_fs[] =
   "#ifdef ADAPTIVE_SAMPLING\n"
   "\n"
   "  // accumulate RGB color and depth\n"
-  "  imageAtomicAdd (uRenderImage, ivec2 (3 * aFragCoord.x + 0,\n"
-  "                                       2 * aFragCoord.y + 0), aColor.r);\n"
-  "  imageAtomicAdd (uRenderImage, ivec2 (3 * aFragCoord.x + 1,\n"
-  "                                       2 * aFragCoord.y + 0), aColor.g);\n"
-  "  imageAtomicAdd (uRenderImage, ivec2 (3 * aFragCoord.x + 1,\n"
-  "                                       2 * aFragCoord.y + 1), aColor.b);\n"
-  "  imageAtomicAdd (uRenderImage, ivec2 (3 * aFragCoord.x + 2,\n"
-  "                                       2 * aFragCoord.y + 1), aColor.w);\n"
+  "  addRenderImageComp (aFragCoord, ivec2 (0, 0), aColor.r);\n"
+  "  addRenderImageComp (aFragCoord, ivec2 (1, 0), aColor.g);\n"
+  "  addRenderImageComp (aFragCoord, ivec2 (1, 1), aColor.b);\n"
+  "  addRenderImageComp (aFragCoord, ivec2 (2, 1), aColor.w);\n"
   "\n"
   "  if (int (aNbSamples) % 2 == 0) // accumulate luminance for even samples only\n"
   "  {\n"
-  "    imageAtomicAdd (uRenderImage, ivec2 (3 * aFragCoord.x + 2,\n"
-  "                                         2 * aFragCoord.y + 0), dot (LUMA, aColor.rgb));\n"
+  "    addRenderImageComp (aFragCoord, ivec2 (2, 0), dot (LUMA, aColor.rgb));\n"
   "  }\n"
   "\n"
   "#else\n"